回滚莫队模板 WA 16 pts求助
查看原帖
回滚莫队模板 WA 16 pts求助
255581
Gao_yc楼主2022/8/22 21:25

只有 #1 #16 #17 AC了,其他全WA

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k,a[N],b[N],m,la[N],fi[N];
int R[N],gk[N];
int ans[N],res,gun;
struct que
{
	int l,r,id;
}q[N];
bool cmp(que A,que B){
	if(gk[A.l]==gk[B.l]) return A.r<B.r;
	return gk[A.l]<gk[B.l];
}
void add(int x,int &Ans)
{
	if(!la[a[x]]) la[a[x]]=x;
	fi[a[x]]=x;
	Ans=max(Ans,x-la[a[x]]);
}
int main()
{
//	freopen("","r",stdin);
//	freopen("","w",stdout);
	scanf("%d",&n);
	k=sqrt(n);
	for(int i=1;i<=n;++i) scanf("%d",a+i),b[i]=a[i];
	sort(b+1,b+n+1);
	int nn=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+nn+1,a[i])-b;
	for(int i=1;i<=n;++i)
	{
		gk[i]=(i-1)/k+1;
		R[gk[i]]=i;
	}
	scanf("%d",&m);
	for(int i=1;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;	
	sort(q+1,q+m+1,cmp); 
	for(int i=1,l=1,r=0,lak=0;i<=m;++i)
	{
		if(gk[q[i].l]==gk[q[i].r])
		{
			gun=0;
			for(int j=q[i].l;j<=q[i].r;++j) 
			{
				if(!la[a[j]]) la[a[j]]=j;
				else gun=max(gun,j-la[a[j]]);
			}
			for(int j=q[i].l;j<=q[i].r;++j) la[a[j]]=0;
			ans[q[i].id]=gun;
			continue;
		}
		if(lak!=gk[q[i].l])
		{
			for(int j=l;j<=r;++j) la[a[j]]=fi[a[j]]=0;
			l=R[gk[q[i].l]]+1;
			r=R[gk[q[i].l]];
			lak=gk[q[i].l];
			res=0;
		}
		while(r<q[i].r) add(++r,res);
		gun=res;
		int nl=l;
		while(nl>q[i].l) 
		{
			nl--;
			if(fi[a[nl]]) gun=max(gun,fi[a[nl]]-nl);
		}
		ans[q[i].id]=gun;
	}
	for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
    return 0;
} 
2022/8/22 21:25
加载中...