AT_joisc2014_c 歴史の研究 讨论帖(回滚莫队)
查看原帖
AT_joisc2014_c 歴史の研究 讨论帖(回滚莫队)
310801
Spouter_27楼主2023/3/29 19:45
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define deb(x) cerr<<"Line: "<<__LINE__<<", val= "<<x<<"; \n"
const ll N=1e5+10,BL=1e3+10;
ll q,n,B,t[N],A[N],a[N],fa[N],ans[N];
ll res,L[BL],R[BL],nr;
void addr(){
	++nr;
	res=max(res,A[a[nr]]*(++t[a[nr]]));
}
struct querys{
	ll l,r,bh;
	bool operator<(const querys &a1) const{
		if(fa[l]==fa[a1.l])	return r<a1.r;
		return l<a1.l;
	}
}c[N];
signed main(){
	scanf("%lld %lld",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&A[i]);
		a[i]=A[i];
	}
	sort(A+1,A+n+1);
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(A+1,A+n+1,a[i])-A;
	}
	B=sqrt(n);
	L[1]=1;
	for(int i=1;i<=n;i++)	fa[i]=(i-1)/B+1,R[fa[i]]=i,L[fa[i]+1]=i+1;
	for(int i=1;i<=q;i++){
		scanf("%lld %lld",&c[i].l,&c[i].r);
		c[i].bh=i;
	}
	sort(c+1,c+q+1);
	ll flag,tmp;
	for(int i=1;i<=q;i++){
		ll l=c[i].l,r=c[i].r;
		if(fa[l]!=fa[c[i-1].l]){
			memset(t,0,sizeof(t));
			res=0;flag=1;
		}
		if(fa[l]==fa[r]){
			res=0;
			for(int i=l;i<=r;i++){
				res=max(res,A[a[i]]*(++t[a[i]]));
			}
			for(int i=l;i<=r;i++){
				t[a[i]]--;
			}
			ans[c[i].bh]=res;
			continue;
		}
		if(flag==1){
			flag=0;
			nr=R[fa[l]];
		}
		while(nr<r)	addr();
		tmp=res;
		for(int i=R[fa[l]];i>=l;i--){
			res=max(res,A[a[i]]*(++t[a[i]]));
		}
		ans[c[i].bh]=res;
		for(int i=R[fa[l]];i>=l;i--){
			t[a[i]]--;
		}
		res=tmp;
	}
	for(int i=1;i<=q;i++){
		printf("%lld\n",ans[i]);
	}
	return 0;
}

悬赏 1-1 RMB 求调试。

2023/3/29 19:45
加载中...