萌新样例过不了裘窕
查看原帖
萌新样例过不了裘窕
605945
luo_xiaoran楼主2024/3/11 10:48
#include<bits/stdc++.h>
#define ll long long
#define N (int)2e5+5
using namespace std;
ll res,len,n,m,an,cnt0[N],cnt1[N],a[N],v[N],pos[N],ans[N];
struct Query{
	int id,L,R;
}q[N];
int read(){
	char c=getchar();
	int sum=0;
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		sum=sum*10+c-'0';
		c=getchar();
	}
	return sum;
}
bool cmp(Query x,Query y){
	return (pos[x.L]^pos[y.L])?(x.L<y.L):((pos[x.L]&1)?(x.R>y.R):(x.R<y.R));
}
int main(){
	n=read();
	len=sqrt(n);
	for(int i=1;i<=n;++i) v[i]=a[i]=read(),pos[i]=(i-1)/len+1;
	sort(a+1,a+1+n);
	an=unique(a+1,a+1+n)-a-1;
	for(int i=1;i<=n;++i) v[i]=lower_bound(a+1,a+1+an,v[i])-a,cnt0[v[i]]=INT_MAX,cnt1[v[i]]=INT_MIN;
	m=read();
	for(int i=1;i<=m;++i) q[i].L=read(),q[i].R=read(),q[i].id=i;
	sort(q+1,q+1+m,cmp);
	for(int i,j,k=1;k<=m;++k){
		if(pos[q[k].L]^pos[q[k-1].L]) res=0,i=pos[q[k].L]*len,j=i-1,memset(cnt0,0x3f3f3f,sizeof(cnt0)),memset(cnt1,0,sizeof(cnt1));
		if(pos[q[k].L]==pos[q[k].R]){
			int cnt2[N],cnt3[N],res1=0;
			memset(cnt2,0x3f3f3f,sizeof(cnt2));
			for(int c=q[k].L;c<=q[k].R;++c){
				cnt2[v[i]]=min(cnt2[v[i]],i);
				cnt3[v[i]]=max(cnt2[v[i]],i);
				res1=max(res1,cnt3[v[i]]-cnt2[v[i]]);
			}
			ans[q[k].id]=res1;
			continue;
		}
		while(j<q[k].R) cnt1[v[++j]]=j,cnt0[v[j]]=min(cnt0[v[j]],(ll)j),res=max(res,cnt1[v[j]]-cnt0[v[j]]);
		int tmp=i,tp=res;
		while(i>q[k].L) cnt0[v[--i]]=i,cnt1[v[i]]=max(cnt1[v[i]],(ll)i),res=max(res,cnt1[v[i]]-cnt0[v[i]]);
		ans[q[k].id]=res;
		while(i<tmp) cnt0[v[i]]=INT_MAX,cnt1[v[i]]=(cnt1[v[i]]==i?INT_MIN:i),++i;
		res=tp;
	}
	for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
	return 0;
}
2024/3/11 10:48
加载中...