本来是用的是vector暴力插入,在2×105的数据范围内TLE 50pts,换成rope后 ,在2×105TLE 80pts,求助如何卡常卡过2×105的数据
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
int n,c[200005],f[200005];
rope<int> a;
inline void add(register int& x,const register int& k){
while(x<=n) c[x]=c[x]>k?c[x]:k,x+=x&-x;
}
inline int query(const register int& x1){
register int res=0,x=x1;
while(x>0) res=res>c[x]?res:c[x],x-=x&-x;
return res;
}
signed main() {
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
auto c1=clock();
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(register int i=1,cc;i<=n;++i) cin>>cc,a.insert(cc,i);
for(register int i=0;i<n;++i) {
register int cc=a[i];
const register int tt=query(cc)+1;
f[cc]=tt;
add(cc,tt);
}
for(register int i=1;i<=n;++i) cout<<f[i]=f[i]>f[i-1]?f[i]:f[i-1])<<\n';
auto c2=clock();
cerr<<"times="<<c2-c1<<"ms\n";
return 0;
}