我写了这样一份代码:
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=100010;
constexpr int maxa=1e9;
struct tree2
{
int val[maxn<<5];
int ls[maxn<<5];
int rs[maxn<<5];
int roots[maxn<<5];
int cnt=0,now=0;
__inline void clone(int &node)
{
val[++cnt]=val[node];
ls[cnt]=ls[node];
rs[cnt]=rs[node];
node=cnt;
}
__inline void insert(int &now,int l,int r,int pos)
{
clone(now);
val[now]+=pos;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)
insert(ls[now],l,mid,pos);
else
insert(rs[now],mid+1,r,pos);
}
__inline int query(int r1,int r2,int l,int r,int ql,int qr)
{
if(val[r2]-val[r1]==0)
return 0;
if(ql<=l&&r<=qr)
return val[r2]-val[r1];
if(qr<l||r<ql)
return 0;
int mid=(l+r)>>1;
return query(ls[r1],ls[r2],l,mid,ql,qr)+query(rs[r1],rs[r2],mid+1,r,ql,qr);
}
__inline int insert(int val)
{
now++;
roots[now]=roots[now-1];
insert(roots[now],1,maxa,val);
}
__inline int query(int l,int r,int ql,int qr)
{
return query(roots[l-1],roots[r],1,maxa,ql,qr);
}
}tr;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int n,m;cin>>n;
for(int i=1;i<=n;i++)
{
int t;cin>>t;
tr.insert(t);
}
//在线时没有跳出这个循环
cin>>m;
for(int i=1;i<=m;i++)
{
int l,r;cin>>l>>r;
if(!tr.query(l,r,1,1)){cout<<"0\n";continue;}
int now=tr.query(l,r,1,1),lst=1;
while(1)
{
int t=tr.query(l,r,lst+1,now+1);
if(!t)break;
else lst=now+1,now+=t;
}
cout<<now+1<<'\n';
}
return 0;
}
它在本地运行样例一切正常,答案也是对的。
但是到了 IDE,样例就会 TLE,而且提交后也会全部 TLE。求大佬解释一下。