代码如下:
#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