回滚莫队 WA 16pts 求调
查看原帖
回滚莫队 WA 16pts 求调
572133
潘德理2010楼主2024/3/1 12:07

看不出哪儿错了。

#include<bits/stdc++.h>
using namespace std;
int sz;
int bl(int x){
	return x/sz;
}
struct nd{
	int l,r,v;
	bool operator<(nd a){
		if(bl(l)!=bl(a.l)) return l<a.l;
		return r<a.r; 
	}
}q[200010];
int n,m,a[200010],b[200010],g;
int le[200010],ri[200010],res,ans[200010];
int l=1,r,lp,lb,tp;
stack<int> s,s1,s2;
int lt[200010],rt[200010];
int br(int x){
	return min((x+1)*sz-1,n);
}
void add(int x){
	le[a[x]]=min(le[a[x]],x);
	ri[a[x]]=max(ri[a[x]],x);
	res=max(res,ri[a[x]]-le[a[x]]);
}
int main(){
	scanf("%d",&n);
	sz=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	g=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+g+1,a[i])-b;
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].v=i;
	}
	sort(q+1,q+m+1);
	memset(le,0x3f3f3f,sizeof(le));
	memset(lt,0x3f3f3f,sizeof(lt));
	for(int i=1;i<=m;i++){
		if(bl(q[i].l)==bl(q[i].r)){
			int rs=0;
			for(int j=q[i].l;j<=q[i].r;j++){
				lt[a[j]]=min(lt[a[j]],j);
				rt[a[j]]=max(rt[a[j]],j);
				rs=max(rs,rt[a[j]]-lt[a[j]]);
			}
			for(int j=q[i].l;j<=q[i].r;j++){
				lt[a[j]]=1<<30;
				rt[a[j]]=0;
			}
			ans[q[i].v]=rs;
			continue;
		}
		if(bl(q[i].l)!=lb){
			memset(le,0x3f3f3f,sizeof(le));
			memset(ri,0,sizeof(ri));
			res=0;
			lb=bl(q[i].l);
			l=br(lb)+1;
			r=br(lb);
		}
		while(r<q[i].r){
			add(++r);
		}
		lp=l;
		tp=res;
		while(lp>q[i].l){
			lp--;
			s.push(lp);
			s1.push(le[a[lp]]);
			s2.push(ri[a[lp]]);
			add(lp);
		}
		ans[q[i].v]=res;
		res=tp;
		while(!s.empty()){
			int u=s.top(),u1=s1.top(),u2=s2.top();
			s.pop(),s1.pop(),s2.pop();
			le[a[u]]=u1;
			ri[a[u]]=u2;
		}
	}
	for(int i=1;i<=m;i++){
		printf("%d\n",ans[i]);
	}
}
2024/3/1 12:07
加载中...