悬关回滚莫队,马蜂良好
查看原帖
悬关回滚莫队,马蜂良好
718017
Dream__maker楼主2024/6/2 20:15
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
ll n, q, blk, bel[N], res, now;
ll typ[N];
unordered_map <ll, ll> sum, hap;
struct node{int l, r, id; int ans;}qus[N];
int cmp(node a, node b) {return bel[a.l] == bel[b.l] ? a.r < b.r : a.l < b.l;}
int cmp2(node a, node b) {return a.id < b.id;}
void revise(int u, int v)
{
	sum[u] += (v > 0 ? 1 : -1);
	if(sum[u] * u > res && v == 2) res = sum[u] * u;
	if(sum[u] * u > now) now = sum[u] * u;
}
int main()
{
	cin >> n >> q; blk = sqrt(n);
	for(int i = 1; i <= n; i ++)
	{
		scanf("%d", &typ[i]);
		bel[i] = (i - 1) / blk + 1;
	}
	for(int i = 1; i <= q; i ++)
	{
		scanf("%d %d", &qus[i].l, &qus[i].r);
		qus[i].id = i;
	}
	sort(qus + 1, qus + q + 1, cmp);
	int lp = 0, rp;
	for(int i = 1; i <= q; i ++)
	{
		int past = bel[qus[i].l] * blk + 1;
		if(bel[qus[i].l] != bel[qus[i - 1].l])
		{
			res = 0;
			sum.clear();
			lp = past; rp = lp - 1;
		}
		now = res;
		if(bel[qus[i].l] == bel[qus[i].r]) 
		{
			int p = 0;
			for(int j = qus[i].l; j <= qus[i].r; j ++)
			{
				hap.clear();
				hap[typ[j]] ++;
				if(hap[typ[j]] * typ[j] > p) p = hap[typ[j]] * typ[j];
			}
			qus[i].ans = p;
			continue;
		}
		while(rp < qus[i].r) revise(typ[rp + 1], 2), rp ++;
		while(lp > qus[i].l) revise(typ[lp - 1], 1), lp --;
		qus[i].ans = now;
		
		while(lp < past) revise(typ[lp], -1), lp ++;
	}
	sort(qus + 1, qus + q + 1, cmp2);
	for(int i = 1; i <= q; i ++) printf("%d\n", qus[i].ans);
	return 0;
}
2024/6/2 20:15
加载中...