萌新刚学莫队求助
查看原帖
萌新刚学莫队求助
119261
7KByte楼主2020/10/2 18:29

Rt,模板题只有1414分。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 400005
using namespace std;
int u[N],bas,n,m,o[N],b[N],T,ans[N];
struct node{
	int l,r,op;
	bool operator<(const node o)const{
		if((l-1)/bas!=(o.l-1)/bas)return l<o.l;
		return r<o.r;
	}
}a[N];
int L[N],R[N],d[N];
int calc(int l,int r){
	int mx=0;
	rep(i,l,r){	
		if(d[u[i]])mx=max(mx,i-d[u[i]]);
		if(!d[u[i]])d[u[i]]=i;
	}
	rep(i,l,r)d[u[i]]=0;
	return mx;
}
int l,r,mx;
void ins(int x){
	if(L[u[x]])mx=max(mx,x-L[u[x]]);
	if(!L[u[x]])L[u[x]]=x;
	R[u[x]]=x;
}
void clear(int l,int r){
	mx=0;rep(i,l,r)L[u[i]]=R[u[i]]=0;
}
int main(){
	//freopen("P5906_3.in","r",stdin);
	scanf("%d",&n);rep(i,1,n)scanf("%d",&u[i]),o[i]=u[i];
	sort(o+1,o+n+1);bas=sqrt(n);
	rep(i,1,n)if(o[i]!=o[i-1])b[++T]=o[i];
	rep(i,1,n)u[i]=lower_bound(b+1,b+T+1,u[i])-b;
	scanf("%d",&m);rep(i,1,m)scanf("%d%d",&a[i].l,&a[i].r),a[i].op=i;
	//cout<<"ss"<<endl;
	sort(a+1,a+m+1);
	//cout<<"tt"<<endl;
	l=r=(a[1].l-1)/bas*bas+bas;ins(l);
	rep(i,1,m){
		//cout<<i<<endl;
		if((a[i].l-1)/bas==(a[i].r-1)/bas){ans[a[i].op]=calc(a[i].l,a[i].r);continue;}
		int k=min(((a[i].l-1)/bas+1)*bas,n);
		//cout<<a[i].l<<" "<<a[i].r<<" "<<k<<endl;
		if(i!=1&&(a[i].l-1)/bas!=(a[i-1].l-1)/bas){
			clear(l,r);
			rep(i,1,T)assert(!L[i]&&!R[i]);
			l=r=k+1;ins(l);
		}
		//cout<<r<<" st "<<a[i].r<<endl;
		assert(a[i].l<=k&&k<=a[i].r);
		//cout<<a[i].l<<" "<<k<<" "<<a[i].r<<endl;
		while(r<a[i].r)ins(++r);
		int now=0;
		pre(j,k,a[i].l)if(R[u[j]])now=max(now,R[u[j]]-j);
		ans[a[i].op]=max(max(mx,now),calc(a[i].l,k));
	}
	rep(i,1,m)printf("%d \n",ans[i]);
	return 0;
}
2020/10/2 18:29
加载中...