0pt 全 TLE 求助
查看原帖
0pt 全 TLE 求助
675466
zzx0102楼主2025/1/4 20:08
#include<bits/stdc++.h>
using namespace std;
#define Ri register int
const int N = 500010, B = 710;
int q, A[B][B], cnt[N], n, a[N], in[N], L[B], R[B], pos[N]; vector<int> v[N]; int b[N];
inline int ask(int l, int r) {
	if(in[l] == in[r]) {
		int mx = 0;
		for(Ri i = l; i <= r; i++) cnt[a[i]] = 0;
		for(Ri i = l; i <= r; i++) mx = max(mx, ++cnt[a[i]]);
		return mx;
	}
	int ans = A[in[l] + 1][in[r] - 1];
	for(Ri i = l; i <= R[in[l]]; i++) {
		int j = pos[i];
		while(j + ans < v[a[i]].size() && v[a[i]][j + ans] <= r) ans++;
	}
	for(Ri i = L[in[r]]; i <= r; i++) {
		int j = pos[i];
		while(j >= ans && v[a[i]][j - ans] >= l) ans++;
	}
	return ans;
}
int main() {
	ios::sync_with_stdio(0);
	cin >> n >> q;
	int B0 = sqrt(n);
	for(int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
	stable_sort(b + 1, b + 1 + n); int tot = unique(b + 1, b + 1 + n) - b - 1;
	for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + 1 + tot, a[i]) - b;
	for(int i = 1; i <= n; i++) {
		in[i] = (i + B0 - 1) / B0;
		v[a[i]].push_back(i);
		pos[i] = v[a[i]].size() - 1;
	}
	int blo = in[n];
	for(int i = 1; i <= blo; i++) L[i] = (i - 1) * B0 + 1, R[i] = min(i * B0, n);
	for(int i = 1; i <= blo; i++) {
		memset(cnt, 0, sizeof cnt);
		for(int j = i; j <= blo; j++) {
			A[i][j] = A[i][j - 1];
			for(Ri k = L[i]; k <= R[j]; k++) A[i][j] = max(A[i][j], ++cnt[a[k]]);
		}
	}
	int lst = 0;
	while(q--) {
		int l, r; cin >> l >> r;
		l ^= lst, r ^= lst;
		if(l > r) swap(l, r);
		cout << (lst = ask(l, r)) << '\n';
	}
	return 0;
}

/*
10 5
1 4 3 1 3 2 1 3 3 1
5 9
1 7
2 5
8 10
3 7

*/
2025/1/4 20:08
加载中...