社区讨论

回滚莫队求调

AT_joisc2014_c歴史の研究参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjusvux
此快照首次捕获于
2025/11/04 08:51
4 个月前
此快照最后确认于
2025/11/04 08:51
4 个月前
查看原帖
C
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, q;
ll a[200005];
struct node {
	ll l, r, id;
} b[100005];
ll ha[200005];
ll x[200005];
ll block;
ll id[200005];
ll ans[100005];
ll now;
void Add(ll p) {
	x[p]++;
	now = max(x[p] * ha[p], now);
}
int main() {
	cin.tie(0), cout.tie(0);
	ios::sync_with_stdio(0);
	cin >> n >> q;
	block = sqrt(n);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		ha[i] = a[i];
		id[i] = (i - 1) / block + 1;
	}
	sort(ha + 1, ha + n + 1);
	int n2 = unique(ha + 1, ha + n + 1) - ha - 1;
	for (int i = 1; i <= n; i++) {
		a[i] = lower_bound(ha + 1, ha + n2 + 1, a[i]) - ha;
	}
	for (int i = 1; i <= q; i++) {
		cin >> b[i].l >> b[i].r;
		b[i].id = i;
		if (b[i].r - b[i].l <= block) {
			for (int j = b[i].l; j <= b[i].r; j++) {
				x[a[j]]++;
			}
			ll nowans = 0;
			for (int j = b[i].l; j <= b[i].r; j++) {
				nowans = max(nowans, x[a[j]] * ha[a[j]]);
				x[a[j]]--;
			}
			ans[i] = nowans;
			b[i].l = n + block;
			b[i].r = n + block;
		}
	}
	sort(b + 1, b + q + 1, [](node X, node Y) {
		if (id[X.l] != id[Y.l])
			return X.l < Y.l;
		return X.r < Y.r;
	});
	int l = 1, r = 0, lstid = 0, backans = 0, backl = 0;
	for (int i = 1; i <= q && b[i].l <= n; i++) {
		if (lstid != id[b[i].l]) {
			lstid = id[b[i].l];
			l = (block) * (lstid) +1;
			r = l - 1;
			now = 0;
			backans = 0;
			memset(x, 0, sizeof x);
		}
		while (r < b[i].r) {
			r++;
			Add(a[r]);
		}
		backans = now;
		backl = l;
		while (l > b[i].l) {
			l--;
			Add(a[l]);
		}
		ans[b[i].id] = now;
		now = backans;
		while (l < backl) {
			x[a[l]]--;
			l++;
		}
	}
	for (int i = 1; i <= q; i++) {
		cout << ans[i] << "\n";
	}
	return 0;
}
提交结果:

回复

3 条回复,欢迎继续交流。

正在加载回复...