回滚莫队,能过样例,AC/WA混合求调
查看原帖
回滚莫队,能过样例,AC/WA混合求调
477821
toolong114514楼主2024/4/30 20:12
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
const int N=1e6+10;
struct node{
	int l,r,ln,ans,fm;
}ask[N];
bool cmp1(node pre,node nxt){
	if(pre.ln!=nxt.ln) return pre.ln<nxt.ln;
	else return pre.r<nxt.r;
}
bool cmp2(node pre,node nxt){
	return pre.fm<nxt.fm;
}
struct ccf{
	int l,r;
}bl[N];
int vst1[N],vst2[N];
int evnt[N],trans[N];
bool tmp[N];
int n,m,cnt,len,maxn1,maxn2,rr;
struct ssb{
	int pos,val;
}fft[N];
bool ccmp(ssb pre,ssb nxt){
	return pre.val<nxt.val;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>evnt[i];
		fft[i].val=evnt[i];
		fft[i].pos=i;
	}
	sort(fft+1,fft+n+1,ccmp);
	for(int i=1;i<=n;i++){
		if(fft[i].val!=fft[i-1].val) cnt++;
		trans[fft[i].pos]=cnt;
	}
	cnt=0;
	int len=sqrt(n);
	for(int i=1;i<=n;i+=len){
		cnt++;
		bl[cnt].l=i;
		bl[cnt].r=min(i+len-1,n);
	}
	for(int i=1;i<=m;i++){
		cin>>ask[i].l>>ask[i].r;
		ask[i].fm=i;
		for(int j=1;j<=cnt;j++){
			if(bl[j].l<=ask[i].l&&ask[i].l<=bl[j].r){
				ask[i].ln=j;
				break;
			}
		}
	}
	sort(ask+1,ask+m+1,cmp1);
	for(int i=1;i<=m;i++){
		if(ask[i].ln!=ask[i-1].ln){
			for(int j=1;j<=n;j++){
				vst1[j]=vst2[j]=0;
			}
			rr=bl[ask[i].ln].r-1;
			maxn1=maxn2=-1;
		}
		if(ask[i].r<bl[ask[i].ln].r){
			for(int j=ask[i].l;j<=ask[i].r;j++){
				vst2[trans[j]]=0;
			}
			for(int j=ask[i].l;j<=ask[i].r;j++){
				vst2[trans[j]]++;
				maxn2=max(maxn2,vst2[trans[j]]*evnt[j]);
			}
			ask[i].ans=maxn2;
			for(int j=ask[i].l;j<=ask[i].r;j++){
				vst2[trans[j]]=0;
			}
			continue;
		}
		while(rr<ask[i].r){
			rr++;
			vst1[trans[rr]]++;
			maxn1=max(maxn1,vst1[trans[rr]]*evnt[rr]);
		}
		maxn2=maxn1;
		for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
			if(!tmp[trans[j]]){
				vst2[trans[j]]=vst1[trans[j]];
				tmp[trans[j]]=true;
			}
			vst1[trans[j]]++;
			maxn1=max(maxn1,vst1[trans[j]]*evnt[j]);
		}
		ask[i].ans=maxn1;
		maxn1=maxn2;
		for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
			if(tmp[trans[j]]) vst1[trans[j]]=vst2[trans[j]];
		}
		for(int j=ask[i].l;j<bl[ask[i].ln].r;j++){
			vst2[trans[j]]=0;
			tmp[trans[j]]=false;
		}
	}
	sort(ask+1,ask+m+1,cmp2);
	for(int i=1;i<=m;i++){
		cout<<ask[i].ans<<'\n';
	}
	return 0;
}
2024/4/30 20:12
加载中...