回滚莫队,样例过不去
查看原帖
回滚莫队,样例过不去
252549
Iwara楼主2024/5/13 08:38

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const ll MAXN=3e5+5;
ll n,q,a[MAXN],tmp[MAXN];
ll blen;
struct block{
	ll l,r;
}b[MAXN];
ll cnt,b_id[MAXN];
ll ans[MAXN];
set<ll> pos[MAXN];
ll _pos_l[MAXN],_pos_r[MAXN];
struct query{
	ll l,r,id;
	bool operator < (const query &oth)const{
		return (l-1)/blen==(oth.l-1)/blen?(r<oth.r):(l-1)/blen<(oth.l-1)/blen;
	}
}Q[MAXN];
void add(ll X,ll &num){
	pos[a[X]].insert(X);
//	cout<<"/kel\n";
	num=max(num,(*(pos[a[X]].end()--))-(*pos[a[X]].begin()));
//	cout<<"/kk\n";
	return;
}
void del(ll X){
//	cout<<"now\n";
	pos[a[X]].erase(X);
//	cout<<"done\n";
	return;
}
vector<ll> que;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	memcpy(tmp,a,sizeof(a));
//	for(int i=1;i<=n;i++)cout<<tmp[i]<<" ";
//	cout<<'\n'; 
	sort(tmp+1,tmp+1+n);
	ll qwq=unique(tmp+1,tmp+1+n)-tmp-1;
//	for(int i=1;i<=qwq;i++)cout<<tmp[i]<<" ";
//	cout<<'\n'; 
	for(int i=1;i<=n;i++)a[i]=lower_bound(tmp+1,tmp+1+qwq,a[i])-tmp;
//	for(int i=1;i<=n;i++)cout<<a[i]<<" ";
//	cout<<'\n';
	blen=sqrt(n);
	for(int i=1;i<=n;i+=blen){
		cnt++;
		b[cnt]=(block){i,min(i+blen-1,n)};
	}
//	for(int i=1;i<=cnt;i++)cout<<b[i].l<<" --- "<<b[i].r<<'\n';
	for(int i=1;i<=cnt;i++)for(int j=b[i].l;j<=b[i].r;j++)b_id[j]=i;
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>Q[i].l>>Q[i].r;
		Q[i].id=i;
	}
	sort(Q+1,Q+1+q);
	ll L=1,R=0,lst=0,_L=0;
	ll Ans=0,reg=0;
	for(int i=1;i<=q;i++){
		if(b_id[Q[i].l]==b_id[Q[i].r]){
			for(int j=Q[i].l;j<=Q[i].r;j++)_pos_l[a[j]]=1e9,_pos_r[a[j]]=0;
			for(ll j=Q[i].l;j<=Q[i].r;j++){
				_pos_l[a[j]]=min(_pos_l[a[j]],j);
				_pos_r[a[j]]=max(_pos_r[a[j]],j);
				ans[Q[i].id]=max(ans[Q[i].id],_pos_r[a[j]]-_pos_l[a[j]]);
			}
			for(int j=Q[i].l;j<=Q[i].r;j++)_pos_l[a[j]]=1e9,_pos_r[a[j]]=0;
			continue;
		}
		if(b_id[Q[i].l]!=lst){
			while(R>b[b_id[Q[i].l]].r)del(R),R--;
			while(L<b[b_id[Q[i].l]].r+1)del(L),L++;
			Ans=0;
			lst=b_id[Q[i].l];
		}
		while(R<Q[i].r)R++,add(R,Ans);
		reg=Ans;
		_L=L;
		while(_L>Q[i].l)_L--,add(_L,reg);
		ans[Q[i].id]=reg;
		while(_L<L)del(_L),_L++;
	}
	for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
	return 0;
} 
2024/5/13 08:38
加载中...