28pts 回滚莫队求助
查看原帖
28pts 回滚莫队求助
636936
tyccyt楼主2024/8/26 16:50
#include <bits/stdc++.h>
using namespace std;
#define Max(a,b) (a>b?a:b)
inline void read(int& x)
{
	x=0;int f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9')
	{
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	x*=f;
}
const int N=1e6+10;
int n,m,a[N],x[N],bl,tot,R[N],st[N],ed[N],e[N];
struct node
{
	int l,r,id;
}q[N];
int d[N],ans[N],mx;
bool cmp(node x,node y)
{
	return (d[x.l]^d[y.l]?d[x.l]<d[y.l]:x.r<y.r);
}
int main()
{
	read(n);
	bl=ceil(sqrt(n));
	tot=(n-1)/bl+1;
	for(int i=1;i<tot;i++)R[i]=i*bl;
	R[tot]=n;
	int cnt=0;
	for(int i=1;i<=n;i++){
		d[i]=(i-1)/bl+1;
		read(a[i]);
		x[++cnt]=a[i];
	}
	sort(x+1,x+n+1);
	cnt=unique(x+1,x+cnt+1)-x-1;
	for(int i=1;i<=n;i++)a[i]=lower_bound(x+1,x+cnt+1,a[i])-x;
	read(m);
	for(int i=1;i<=m;i++)
	{
		read(q[i].l),read(q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int l=1,r=0,ql=0,qr=0,lsbl=0;
	for(int i=1;i<=m;i++)
	{
		ql=q[i].l,qr=q[i].r;
		if(d[ql]==d[qr])
		{
			int mxx=0;
			for(int j=ql;j<=qr;j++)st[a[j]]=0;
			for(int j=ql;j<=qr;j++)
			{
				if(st[a[j]])
				{
					mxx=Max(mxx,j-st[a[j]]);
				}
				if(!st[a[j]])st[a[j]]=j;
			}
			for(int j=ql;j<=qr;j++)st[a[j]]=0;
			ans[q[i].id]=mxx;
			continue;
		}
		if(lsbl!=d[ql])
		{
			for(int j=l;j<=r;j++)st[a[j]]=ed[a[j]]=0;
			l=R[d[ql]];
			r=R[d[ql]]-1;
			lsbl=d[ql];
		}
		while(r<qr)
		{
			r++;
			ed[a[r]]=r;
			if(!st[a[r]])st[a[r]]=r;
			mx=Max(mx,r-st[a[r]]);
		}
		int l1=l,temp=mx;
		while(l1>ql)
		{
			l1--;
			if(e[a[l1]]==0)e[a[l1]]=l1;
			temp=Max(temp,Max(ed[a[l1]],e[a[l1]])-l1);
		}
		while(l1<l)
		{
			e[a[l1]]=0;
			l1++;
		}
		ans[q[i].id]=temp;
	}
	for(int i=1;i<=m;i++)
	{
		cout<<ans[i]<<'\n';
	}
	return 0;
}

过了 1,2,3,16,171,2,3,16,17 这些点,其他点全 WA ,请求帮助----

2024/8/26 16:50
加载中...