大部分的AC代码时间在2至3秒左右,为什么这份代码大约6秒。是写法有问题吗?
#include<bits/stdc++.h>
#define bl(x) block(x)
using namespace std;
const int N=200005;
int ans,n,m,nf;
int ba[N],a[N],lp[N],rp[N],l,r;
struct Origin{int pos,num;}ori[N];
bool cmppp(Origin i,Origin j){return i.num<j.num;}
struct Modui{int l,r,an,nu;}q[N];
int block(int x){return (x-1)/nf+1;}
bool cmp(Modui i,Modui j){
if(bl(i.l)==bl(j.l))return i.r<j.r;
return i.l<j.l;
}
bool cmpp(Modui i,Modui j){return i.nu<j.nu;}
struct ZT{int pos,lo,ro,oans;};
stack<ZT> s;
inline void getback(){
int pos=s.top().pos,lo=s.top().lo,ro=s.top().ro,oans=s.top().oans;
lp[pos]=lo,rp[pos]=ro,ans=oans;
s.pop();
return;
}
inline void add(int x){
s.push((ZT){a[x],lp[a[x]],rp[a[x]],ans});
lp[a[x]]=min(x,lp[a[x]]);
rp[a[x]]=max(x,rp[a[x]]);
ans=max(rp[a[x]]-lp[a[x]],ans);
}
int main(){
scanf("%d",&n);
nf=sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&ori[i].num);
ori[i].pos=i;
}
sort(ori+1,ori+n+1,cmppp);
int tot=0;
for(int i=1;i<=n;i++){
if(ori[i].num!=ori[i-1].num)tot++;
ba[tot]=ori[i].num;
a[ori[i].pos]=tot;
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].nu=i;
}
sort(q+1,q+m+1,cmp);
memset(lp,0x3f,sizeof(lp));
for(int i=1;i<=m;i++){
if(bl(q[i].l)!=bl(q[i-1].l)||q[i-1].l==0){
int lbl=bl(q[i].l)*nf+1;
l=min(n+1,lbl);
r=l-1;
while(!s.empty())getback();
}
if(bl(q[i].l)==bl(q[i].r)){
for(int j=q[i].l;j<=q[i].r;j++)add(j);
q[i].an=ans;
while(!s.empty())getback();
continue;
}
while(r<q[i].r)add(++r);
int num=0;
while(l>q[i].l){
num++;
add(--l);
}
q[i].an=ans;
l=bl(q[i].l)*nf+1;
while(num--)getback();
}
sort(q+1,q+m+1,cmpp);
for(int i=1;i<=m;i++)printf("%d\n",q[i].an);
return 0;
}