AT1219求问
  • 板块学术版
  • 楼主fighterkong
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/1/1 13:47
  • 上次更新2023/10/28 13:11:22
查看原帖
AT1219求问
547618
fighterkong楼主2022/1/1 13:47
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,k=1;
	char ch=getchar();
	while (ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*k;
}
int disperse[100005],a[100005],len,blo[100005],buck[100005],ans[100005],buck1[100005];
struct node
{
	int l,r,index;
}e[100005];
inline bool cmp(node s,node s1){if(blo[s.l]==blo[s1.l]) return s.r<s1.r;return s.l<s1.l;}
inline int calc(int l,int r)
{
	int res=0;
	for(int i=l;i<=r;++i)++buck1[a[i]];
	for(int i=l;i<=r;++i)res=max(res,(int)buck1[a[i]]*disperse[a[i]]);
	for(int i=l;i<=r;++i)--buck1[a[i]];
	return res;
}
signed main()
{
	int n=read(),q=read();
	len=sqrt(n);
	for (int i=1;i<=n;++i){disperse[i]=a[i]=read();blo[i]=(i-1)/len+1;}
	sort(disperse+1,disperse+n+1);
	int tot=unique(disperse+1,disperse+n+1)-disperse-1;
	for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
	for(int i=1;i<=q;++i){e[i].index=i;e[i].l=read();e[i].r=read();}
	sort(e+1,e+q+1,cmp);
	int bn=blo[n];
	for(int i=1,j=1;i<=bn;++i)
	{
		int blor=min(n,i*len);
		int l=blor+1,r=blor,temp=0;
		memset(buck,0,sizeof(buck));
		while (blo[e[j].l]==i)
		{
			if(blo[e[j].r]==i)
			{
				ans[e[j].index]=calc(e[j].l,e[j].r);
				++j;
				continue;
			}
			while (r<e[j].r)
			{
				++r;
				++buck[a[r]];
				temp=max(temp,(int)buck[a[r]]*disperse[a[r]]);
			}
			int tt=temp;
			while (e[j].l<l)
			{
				--l;
				++buck[a[l]];
				temp=max(temp,(int)buck[a[l]]*disperse[a[l]]);
			}
			ans[e[j].index]=temp;
			while(l<=blor)
			{
				--buck[a[l]];
				++l;
			}
			temp=tt;
			++j;
		}
	}
	for(int i=1;i<=q;++i)printf("%lld\n",ans[i]);
	return 0;
}
2022/1/1 13:47
加载中...