萌新求助,关于TLE
查看原帖
萌新求助,关于TLE
612567
Kazeno_Akina楼主2023/10/25 18:21

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{int l,r,lc,rc,maxi;};
int k,n,maxb,t,tot,b[N];
node tr[N<<3];
bitset<20000005> s;
void upd(int p,int x,int r){
  if(tr[p].l==tr[p].r){tr[p].maxi=max(tr[p].maxi,r);return;}
  int mid=tr[p].l+tr[p].r>>1;
  if(x<=mid){
    if(!tr[p].lc) tr[p].lc=++tot,tr[tr[p].lc].l=tr[p].l,tr[tr[p].lc].r=mid;
    upd(tr[p].lc,x,r);
  }
  else{
    if(!tr[p].rc) tr[p].rc=++tot,tr[tr[p].rc].l=mid+1,tr[tr[p].rc].r=tr[p].r;
    upd(tr[p].rc,x,r);
  }
  if(tr[p].lc) tr[p].maxi=max(tr[p].maxi,tr[tr[p].lc].maxi);
  if(tr[p].rc) tr[p].maxi=max(tr[p].maxi,tr[tr[p].rc].maxi);
}
long long query(int p,int l,int r){
  if(l<=tr[p].l&&tr[p].r<=r) return tr[p].maxi;
  int mid=tr[p].l+tr[p].r>>1;
  long long res=0;
  if(l<=mid) if(tr[p].lc) res=max(res,query(tr[p].lc,l,r));
  if(mid<r) if(tr[p].rc) res=max(res,query(tr[p].rc,l,r));
  return res;
}
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  cin >> k >> n >> maxb >> t;
  if(n*t<=5000){
    while(k--){
      memset(tr,0,sizeof(tr));
      tr[1].r=maxb,tot=1;
      for(int i=1;i<=n;++i) cin >> b[i];
      for(int i=1;i<=t;++i) for(int j=1;j<=n;++j) upd(1,b[j],query(1,0,b[j]-1)+1);
      cout << tr[1].maxi << '\n';
    }
  }
  else{
    while(k--){
      tot=0;
      for(int i=1;i<=n;++i){
        cin >> b[i];
        if(!s[b[i]]) s[b[i]]=1,++tot;
      }
      cout << tot << '\n';
      for(int i=1;i<=n;++i) s[b[i]]=0;
    }
  }
  return 0;
}

虽然是乱搞但是前后部分的复杂度对于对应的数据来说都不应该TLE呀。为什么呢,求助qwq

2023/10/25 18:21
加载中...