回滚莫队模板代码思路正确34ptsTLE求优化
查看原帖
回滚莫队模板代码思路正确34ptsTLE求优化
933802
ICU152_lowa_IS8楼主2024/7/27 00:48

感觉问题应该出在连续四个memset上

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int a[1000005];
int b[1000005];
int cnt=0;
struct node{
	int l,r,ans,id;
}ask[1000005];
int bl[1000005];
int tmaxn[1000005],tminn[1000005];
int maxn[1000005],minn[1000005];
vector<int>use;
bool cmp(node a,node b){
	if(bl[a.l]==bl[b.l])return a.r<b.r;
	return bl[a.l]<bl[b.l];
}
int tans,ans=0;
inline void add(int t,bool fl){
	if(maxn[a[t]]==-1)maxn[a[t]]=t;
	else maxn[a[t]]=max(maxn[a[t]],t);
	if(minn[a[t]]==-1)minn[a[t]]=t;
	else minn[a[t]]=min(minn[a[t]],t);
	if(fl){
		tans=max(tans,maxn[a[t]]-minn[a[t]]);
		if(tmaxn[a[t]]==-1)tmaxn[a[t]]=t;
		else tmaxn[a[t]]=max(tmaxn[a[t]],t);
		if(tminn[a[t]]==-1)tminn[a[t]]=t;
		else tminn[a[t]]=min(tminn[a[t]],t);
	}
	ans=max(ans,maxn[a[t]]-minn[a[t]]);
}
bool cmmp(node a,node b){
	return a.id<b.id;
}
int bmin[1000005];
int bmax[1000005];
signed main(){
	ios::sync_with_stdio(false); 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		bl[i]=(i+(int)(sqrt(n))-1)/(int)(sqrt(n));
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		if(!mp[b[i]]){
			mp[b[i]]=++cnt;
		}
	}
	for(int i=1;i<=n;i++){
		a[i]=mp[a[i]];
	}
	int m;
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>ask[i].l>>ask[i].r;
		ask[i].id=i;
	}
	sort(ask+1,ask+m+1,cmp);
	int l=1,r=0,nowbl=0,tl;
	for(int i=1;i<=m;i++){
		if(bl[ask[i].l]==bl[ask[i].r]){
			int sum=0;
			for(int j=ask[i].l;j<=ask[i].r;j++){
				bmax[a[j]]=-1;
				bmin[a[j]]=-1;
			}
			for(int j=ask[i].l;j<=ask[i].r;j++){
				if(bmax[a[j]]==-1)bmax[a[j]]=j;
				if(bmin[a[j]]==-1)bmin[a[j]]=j; 
				bmax[a[j]]=max(bmax[a[j]],j);
				bmin[a[j]]=min(bmin[a[j]],j);
				sum=max(sum,bmax[a[j]]-bmin[a[j]]);
			}
			ask[i].ans=sum;
			continue;
		}
		if(bl[ask[i].l]!=nowbl){
			use.clear();
			memset(maxn,-1,sizeof(maxn));
			memset(minn,-1,sizeof(minn));
			memset(tmaxn,-1,sizeof(tmaxn));
			memset(tminn,-1,sizeof(tminn)); 
			nowbl=bl[ask[i].l];
			tans=0;
			ans=0;
			tl=bl[ask[i].l]*(int)(sqrt(n)); 
			l=tl,r=tl-1;
			while(r<ask[i].r){
				add(++r,1);
			}
			tans=ans;
		}
		for(int i=0;i<use.size();i++){
			maxn[use[i]]=tmaxn[use[i]];
			minn[use[i]]=tminn[use[i]];
		}
		use.clear();
		l=tl;
		ans=tans;
		while(r<ask[i].r){
			add(++r,1);
		}
		while(l>ask[i].l){
			add(--l,0);
			use.push_back(a[l]);
		}
		ask[i].ans=ans;
	}
	sort(ask+1,ask+m+1,cmmp);
	for(int i=1;i<=m;i++){ 
		cout<<ask[i].ans<<"\n";
	}
	return 0;
}
2024/7/27 00:48
加载中...