萌新求hack!
查看原帖
萌新求hack!
494192
ChickenDrinkingMilk楼主2023/3/24 12:48
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=200000;
int n,m,T,a[N+5],b[N+5],c[N+5],bl;
ll ans,qans[N+5];
struct Query{
	int l,r,id;
}q[N+5];
bool operator <(const Query &a,const Query &b){
	return a.l/bl^b.l/bl?a.l<b.l:a.r<b.r;
}
void Add(int pos){
//	ll sum=1ll*(++c[a[pos]])*b[a[pos]];
//	ans=(ans<sum?sum:ans);
	ans=max(ans,1ll*(++c[a[pos]])*b[a[pos]]);
}
int main(){
//	freopen("historical.in","r",stdin);
//	freopen("historical.out","w",stdout);
	ios::sync_with_stdio(0);
	cin>>n>>T;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];//离散化 
	}
	sort(b+1,b+n+1);
	m=unique(b+1,b+n+1)-b-1;//去重 
	for (int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+m+1,a[i])-b;//a[i]记录原来a[i]在b中的下标 
	bl=sqrt(n);
	for (int i=1;i<=T;i++){
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
		if (q[i].l/bl==q[i].r/bl){//同块内暴力处理 
			for (int j=q[i].l;j<=q[i].r;j++) Add(j);
			qans[q[i].id]=ans,ans=0;
			for (int j=q[i].r;j>=q[i].l;j--) --c[a[j]];
			q[i].l=q[i].r=n+bl;//标记为已处理 
		}
	}
	sort(q+1,q+T+1);
	ll backans=0;
	for (int i=1,L=bl,R=bl-1,bi=0;q[i].l<=n&&i<=T;i++){
		if (bi^q[i].l/bl){//进入下一个块 
			bi=q[i].l/bl,L=bi*bl+bl,R=L-1;
			backans=ans=0;
			memset(c,0,sizeof(c));
		} 
		while (R<q[i].r) Add(++R);
		backans=ans;
		while (L>q[i].l) Add(--L);
		qans[q[i].id]=ans;
		while (L<bi*bl+bl) c[a[L++]]--;
		ans=backans; 
	}
	for (int i=1;i<=T;i++) cout<<qans[i]<<'\n';
}

22pts,思路基本同第一篇题解

2023/3/24 12:48
加载中...