求助,回滚莫队
查看原帖
求助,回滚莫队
109220
Farkas_W楼主2021/8/4 17:14

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解惑

2021/8/4 17:14
加载中...