94分,WA第一个点
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register int
#define il inline
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
il void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x/10)print(x/10);
putchar(x%10+'0');
}
il int max(int x,int y){return x>y?x:y;}
const int N=2e5+5;
int n,m,k,a[N],b[N],L[N],R[N],blo[N],bl,tot,now,last,ans[N],c[N][2],f[N][2];
struct node{int l,r,id;}q[N];
il bool cmp(node x,node y){return blo[x.l]==blo[y.l]?x.r<y.r:x.l<y.l;}
il int find(int l,int r)
{
int res=0;
for(re i=l;i<=r;i++)
{
if(!f[a[i]][0])f[a[i]][0]=i;
else res=max(res,i-f[a[i]][0]);
}
for(re i=l;i<=r;i++)if(f[a[i]][0])f[a[i]][0]=0;
return res;
}
signed main()
{
n=read();k=sqrt(n);bl=n/k;
for(re i=1;i<=n;i++)a[i]=b[i]=read();
sort(b+1,b+n+1);tot=unique(b+1,b+n+1)-b-1;
for(re i=1;i<=n;i++)
{
blo[i]=(i-1)/k+1;
a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
}
for(re i=1;i<=bl;i++)L[i]=R[i-1]+1,R[i]=R[i-1]+k;
if(R[bl]<n)bl++,L[bl]=R[bl-1]+1,R[bl]=n;
m=read();
for(re i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1,cmp);
for(re i=1,t=1,l,r;i<=bl;i++)
{
r=R[i];l=R[i]+1;now=0;
for(re j=1;j<=tot;j++){if(c[j][0])c[j][0]=0;if(c[j][1])c[j][1]=0;}
while(blo[q[t].l]==i){
if(q[t].r-q[t].l<=k){ans[q[t].id]=find(q[t].l,q[t].r);t++;continue;}/////////////////
while(r<q[t].r){
++r;
if(!c[a[r]][0])c[a[r]][0]=c[a[r]][1]=r;
else c[a[r]][1]=r;
now=max(now,c[a[r]][1]-c[a[r]][0]);
}
last=now;
while(l>q[t].l){
--l;
if(!c[a[r]][0]){
if(!f[a[l]][0])f[a[l]][0]=f[a[l]][1]=l;
else f[a[l]][1]=l;
now=max(now,f[a[l]][0]-f[a[l]][1]);
}
else {
f[a[l]][1]=l;
now=max(now,c[a[l]][1]-f[a[l]][1]);
}
}
ans[q[t].id]=now;
while(l<=R[i]){
if(f[a[l]][0])f[a[l]][0]=0;
if(f[a[l]][1])f[a[l]][1]=0;
l++;
}
now=last;t++;
}
}
for(re i=1;i<=m;i++)print(ans[i]),putchar('\n');
return 0;
}
另外我标注的那一行改成其他写法会错更多,不知道原因
if(q[t].r-q[t].l<k){ans[q[t].id]=find(q[t].l,q[t].r);t++;continue;}//88分
if(q[t].r-q[t].l+1<=k){ans[q[t].id]=find(q[t].l,q[t].r);t++;continue;}//88分
if(blo[q[t].r]==i){ans[q[t].id]=find(q[t].l,q[t].r);t++;continue;}//16分
求dalao解惑