求调
查看原帖
求调
572133
潘德理2010楼主2024/1/18 20:20

代码还没来得及写离散化,但样例好像过不去。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sz;
struct nd{
	int l,r,v;
	inline bool operator<(nd a){
		if(l/sz!=a.l/sz) return l<a.l;
		return r<a.r;
	}
}q[100010];
int n,m,a[100010],cnt[100010],l=1,r,lt,lb;
ll ans[100010],res,tp;
inline void add(int u){
	cnt[u]++;
	res=max(res,1ll*cnt[u]*u);
}
inline void del(int u){
	cnt[u]--;
}
inline int pos(int u){
	return (u+sz-1)/sz;
}
inline int ed(int u){
	return min(u*sz,n);
}
int main(){
	scanf("%d%d",&n,&m);
	sz=sqrt(n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].v=i;
	}
	sort(q+1,q+m+1);
	for(int i=1;i<=m;i++){
		if(pos(q[i].l)==pos(q[i].r)){
			for(int j=q[i].l;j<=q[i].r;j++) cnt[a[j]]++;
			for(int j=q[i].l;j<=q[i].r;j++){
				ans[q[i].v]=max(ans[q[i].v],1ll*cnt[a[j]]*a[j]);
			}
			for(int j=q[i].l;j<=q[i].r;j++) cnt[a[j]]--;
			continue;
		}
		if(pos(q[i].l)!=lb){
			while(r>ed(pos(q[i].l))) del(a[r--]);
			while(l<ed(pos(q[i].l))+1) del(a[l++]);
			res=0;
			lb=pos(q[i].l);
		}
		while(r<q[i].r) add(a[++r]);
		lt=l;
		tp=res;
		while(lt>q[i].l) add(a[--lt]);
		ans[q[i].v]=res;
		res=tp;
		while(lt<l) del(a[lt++]);
	} 
	for(int i=1;i<=m;i++){
		printf("%lld\n",ans[i]);
	}
}
2024/1/18 20:20
加载中...