纯回滚莫队板子求调
查看原帖
纯回滚莫队板子求调
933802
ICU152_lowa_IS8楼主2024/10/9 23:44

RT

#include<bits/stdc++.h>
//#define int long long
using namespace std;
int a[1000005];
int s[1000005];
int f[1000005];
int bl[1000005];
int maxn[1000005],minn[1000005];
int tmaxn[1000005],tminn[1000005];
int bmaxn[1000005],bminn[1000005];
vector<int>use;
int ans=0;
struct node{
	int l,r,id,ans;
}ask[1000005];
void add(int t,int fl){
	if(fl){
		tmaxn[s[t]]=max(tmaxn[s[t]],t);
		if(tminn[s[t]]==-1)tminn[s[t]]=t;
		else tminn[s[t]]=min(tminn[s[t]],t);
	}
	maxn[s[t]]=max(maxn[s[t]],t);
	if(minn[s[t]]==-1)minn[s[t]]=t;
	else minn[s[t]]=min(minn[s[t]],t);
	ans=max(ans,maxn[s[t]]-minn[s[t]]);
//	cout<<s[t]<<' '<<maxn[s[t]]<<" "<<minn[s[t]]<<' '<<ans<<endl;
}
int blsiz;
bool cmp(node a,node b){
	if(bl[a.l]==bl[b.l])return a.r<b.r;
	return a.l<b.l;
}
bool Cmp(node a,node b){
	return a.id<b.id;
}
signed main(){
	ios::sync_with_stdio(false);
	int n,q;
	cin>>n>>q;
	blsiz=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		bl[i]=(i+(int)(sqrt(n))-1)/(int)(sqrt(n));
		s[i]=s[i-1]+a[i];
	}
//	for(int i=1;i<=n;i++){
//		cout<<bl[i]<<" ";
//	}
//	cout<<endl;
	for(int i=0;i<=n;i++){
		s[i]+=100000;
	}
//	for(int i=1;i<=n;i++){
//		cout<<s[i]<<' ';
//	}
//	cout<<endl;
	memset(minn,-1,sizeof(minn));
	memset(tminn,-1,sizeof(tminn));
//	tminn[100000]=0;
//	minn[0]=0;
//	int l=1,r=0,nowbl=0;
	for(int i=1;i<=q;i++){
		cin>>ask[i].l>>ask[i].r;
//		ask[i].l--;
		ask[i].id=i;
	}
	sort(ask+1,ask+q+1,cmp);
	int l=1,r=0,nowbl=-1,nowl,tans;
	for(int i=1;i<=q;i++){
//		cout<<ask[i].l<<" "<<bl[ask[i].l]<<" "<<ask[i].r<<endl;
		if(bl[ask[i].l]==bl[ask[i].r]){
//			cout<<"DOOM"<<ask[i].l<<" "<<ask[i].r<<endl;
//			cout<<"DOOM\n";
			for(int j=ask[i].l-1;j<=ask[i].r;j++){
				bmaxn[s[j]]=bminn[s[j]]=-1;
			}
			int cnt=0;
			for(int j=ask[i].l-1;j<=ask[i].r;j++){
				bmaxn[s[j]]=max(bmaxn[s[j]],j);
				if(bminn[s[j]]==-1)bminn[s[j]]=j;
			}
			for(int j=ask[i].l-1;j<=ask[i].r;j++){
				cnt=max(cnt,bmaxn[s[j]]-bminn[s[j]]);
			}
			ask[i].ans=cnt;
			continue;
		}
		if(bl[ask[i].l]!=nowbl){
			ans=0;
			use.clear();
			for(int i=max(0,nowl-(int)sqrt(n));i<=r;i++){
				tmaxn[s[i]]=tminn[s[i]]=maxn[s[i]]=minn[s[i]]=-1;
			}
			nowbl=bl[ask[i].l];
			nowl=bl[ask[i].l]*(int)(sqrt(n));
			l=nowl,r=nowl-1;
			while(r<ask[i].r){
//				cout<<r<<" "<<ask[i].r<<" "<<tans<<endl;
				add(++r,1);
			}
			tans=ans;
//			cout<<l<<" "<<r<<" "<<nowl<<endl;
//			cout<<tans<<endl;
//			cout<<tans<<' '<<endl;
		}
//		for(int i=100000;i<=100001;i++){
//			cout<<tmaxn[i]<<" "<<maxn[i]<<"-"<<tminn[i]<<" "<<minn[i]<<"  ";
//		}
//		cout<<endl;
		ans=tans;
		l=nowl;
		while(r<ask[i].r){
			add(++r,1);
		}
		while(l>ask[i].l-1){
//			cout<<l<<"-"<<ask[i].l<<endl;
			use.push_back(--l);
			add(l,0);
		}
//		cout<<l<<" "<<r<<" "<<tans<<" "<<ans<<" "<<nowl<<endl;
		
//		cout<<tans<<" "<<ans<<endl<<endl;
		ask[i].ans=ans;
		while(!use.empty()){
//			cout<<s[use[use.size()-1]]<<endl;
			maxn[s[use[use.size()-1]]]=tmaxn[s[use[use.size()-1]]];
			minn[s[use[use.size()-1]]]=tminn[s[use[use.size()-1]]];
			use.pop_back();
		}
//		while(ask)
	}
	sort(ask+1,ask+q+1,Cmp);
	for(int i=1;i<=q;i++)cout<<ask[i].ans<<endl;
	return 0;
}
/*
5 1
-1 1 -1 1 -1
1 3
*/
2024/10/9 23:44
加载中...