Mnzn刚学回滚莫队WAon#20求调,码风良好
查看原帖
Mnzn刚学回滚莫队WAon#20求调,码风良好
933802
ICU152_lowa_IS8楼主2024/7/27 22:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
int b[100005];
map<int,int>mp;
int n,q;
int ccnt=0;
vector<int>use;
struct node{
	int id,l,r,ans;
}ask[100005];
int real_[100005];
int bl[100005];
void lsh(){
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		if(!mp[b[i]]){
			mp[b[i]]=++ccnt;
			real_[ccnt]=b[i];
		}
	}
	for(int i=1;i<=n;i++){
		bl[i]=(i+(int)sqrt(n)-1)/(int)sqrt(n);
		a[i]=mp[a[i]];
	}
}
bool cmp(node a,node b){
	if(bl[a.l]==bl[b.l])return a.r<b.r;
	return a.l<b.l;
}
int ans,tans;
int bcnt[100005];
int tcnt[100005];
int cnt[100005];
void add(int t,int f){
	cnt[a[t]]++;
	ans=max(ans,real_[a[t]]*cnt[a[t]]);
//	cout<<t<<" "<<cnt[a[t]]<<" "<<real_[a[t]]<<"ASD"<<ans<<"\n"; 
	if(f){
		tcnt[a[t]]++;
		tans=max(tans,real_[a[t]]*tcnt[a[t]]);
	}
}
bool ccmp(node a,node b){
	return a.id<b.id; 
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	lsh();
	for(int i=1;i<=q;i++){
		cin>>ask[i].l>>ask[i].r;
		ask[i].id=i;
	}
	sort(ask+1,ask+q+1,cmp);
	int l=1,r=0,nowbl=0,tl=0;
	for(int i=1;i<=q;i++){
		if(bl[ask[i].l]==bl[ask[i].r]){
			for(int j=ask[i].l;j<=ask[i].r;j++){
				bcnt[a[j]]=0;
			}
			int ans=0;
			for(int j=ask[i].l;j<=ask[i].r;j++){
				bcnt[a[j]]++;
				ans=max(ans,real_[a[j]]*bcnt[a[j]]);
			}
			ask[i].ans=ans;
			continue;
		}
		if(nowbl!=bl[ask[i].l]){
			tans=ans=0;
			for(int j=max(tl-(int)sqrt(n),1ll);j<=r;j++){
				tcnt[a[j]]=cnt[a[j]]=0;
			}
			nowbl=bl[ask[i].l];
			tl=bl[ask[i].l]*sqrt(n),r=tl-1;
			while(r<ask[i].r){
				add(++r,1);
			}
		}
		l=tl;
		ans=tans;
		while(l>ask[i].l){
			add(--l,0);
			use.push_back(a[l]);
		}
		while(r<ask[i].r){
			add(++r,1);
		}
		ask[i].ans=ans;
		for(int i=0;i<use.size();i++){
			cnt[use[i]]--;
		}
		use.clear();
	}
	sort(ask+1,ask+q+1,ccmp);
	for(int i=1;i<=q;i++){
		cout<<ask[i].ans<<endl;
	}
	return 0;
}
2024/7/27 22:12
加载中...