求助回滚莫队
查看原帖
求助回滚莫队
162196
伟大的王夫子楼主2022/1/29 09:21
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void Rd(T &x) {
	x = 0;
	bool f = 0;
	char ch = getchar();
	while (!isdigit(ch)) f |= ch == '-', ch = getchar();
	while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
	if (f)
		x = -x;
}
const int N = 2e5 + 5;
int n, m, a[N], St[N], Ed[N], __St[N], __Ed[N], b[N], L[320], R[320];
int bel[N];
int now, ans[N];
struct P {
	int l, r, id;
	bool operator < (const P &a) const {
		return bel[l] == bel[a.l] ? r < a.r : l < a.l;
	}
} Q[N];
int main() {
	Rd(n);
	int tt = 0;
	for (int i = 1; i <= n; ++i) Rd(a[i]), b[++tt] = a[i];
	Rd(m);
	for (int i = 1; i <= m; ++i) Rd(Q[i].l), Rd(Q[i].r), Q[i].id = i;
	sort(b + 1, b + tt + 1);
	tt = unique(b + 1, b + tt + 1) - b - 1;
	for (int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + tt + 1, a[i]) - b;
	int SI = sqrt(n), Bnum = SI;
	for (int i = 1; i <= Bnum; ++i) {
		L[i] = (i - 1) * SI + 1;
		R[i] = i * SI;
	}
	if (R[Bnum] < n) L[Bnum + 1] = R[Bnum] + 1, R[++Bnum] = n;
	for (int i = 1; i <= Bnum; ++i) 
		for (int j = L[i]; j <= R[i]; ++j) bel[j] = i;
	sort(Q + 1, Q + m + 1);
	int last_block = 0;
	for (int i = 1, l = 1, r = 0; i <= m; ++i) {
		if (bel[Q[i].l] == bel[Q[i].r]) {
			for (int j = Q[i].l; j <= Q[i].r; ++j) __St[a[j]] = 0;
			for (int j = Q[i].l; j <= Q[i].r; ++j) {
				if (!__St[a[j]]) __St[a[j]] = j;
				ans[Q[i].id] = max(ans[Q[i].id], j - __St[a[j]]);
			}
			continue;
		}
		if (last_block != bel[Q[i].l]) {
			for (int j = l; j <= r; ++j) St[a[j]] = Ed[a[j]] = 0;
			l = R[bel[Q[i].l]] + 1, r = R[bel[Q[i].l]];
			now = 0;
			last_block = bel[Q[i].l];
		}
		while (r < Q[i].r) {
			++r, Ed[a[r]] = r;
			if (St[a[r]]) now = max(now, r - St[a[r]]);
			else St[a[r]] = r;
		}
		int __l = l;
		for (int j = Q[i].l; j <= __l; ++j) __Ed[a[j]] = Ed[a[j]];
		int tmp = now;
		while (__l > Q[i].l) {
			--__l, tmp = max(tmp, Ed[a[__l]] - __l);
			if (!Ed[a[__l]]) Ed[a[__l]] = __l;
		}
		for (int j = Q[i].l; j <= l; ++j) Ed[a[j]] = __Ed[a[j]];
		ans[Q[i].id] = tmp;
	}
	for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
}

求助大佬为什么只有28。经测试暴力部分正确无误(暴力58分)

2022/1/29 09:21
加载中...