P4135 40pts 求调!!!
查看原帖
P4135 40pts 求调!!!
597004
IRIDESCENTqwq楼主2024/1/20 11:40

rt,

#include <bits/stdc++.h>
#define int long long
#define NR 317
using namespace std;
int n, c, m, a[100010], l, r, MAXN, siz = 0;
int ans[NR][NR], cnt[100010][NR], b[100010];
int BLS(int i){
	if (i % MAXN == 0) return i / MAXN;
	return i / MAXN + 1;
}
signed main(){
	ios::sync_with_stdio(false);
	cin >> n >> c >> m;
	MAXN = (int)(pow(n, 0.5));
	siz = !(n%MAXN) ? n/MAXN : n/MAXN+1; 
	for (int i = 1; i <= n; i++){
		cin >> a[i];
	}
	// 求cnt↓↓↓ 
	for (int i = 1; i <= siz; i++){
		memset(b, 0, sizeof b);
		for (int j = (i - 1) * MAXN + 1; j <= min(i * MAXN, n); j++) b[a[j]]++;
		for (int j = 1; j <= c; j++) cnt[j][i] = cnt[j][i - 1] + b[j];
	}
	// 求ans↓↓↓ 
	for (int i = 1; i <= siz; i++){
		memset(b, 0, sizeof b);
		for (int j = (i - 1) * MAXN + 1; j <= n; j++){
			ans[i][BLS(j)] = ans[i][BLS(j - 1)];
			b[a[j]]++;
			if (b[a[j]] % 2 == 0){
				ans[i][BLS(j)]++;
			}
			else if (b[a[j]] > 1){ 
				ans[i][BLS(j)]--;
			}
		}
	}
	memset(b, 0, sizeof b);
	int res = 0;
	while (m--){
		int ll, rr;
		cin >> ll >> rr;
		l = (ll + res) % n + 1, r = (rr + res) % n + 1;
		if (l > r) swap(l, r);
		res = 0;
		if (BLS(l) == BLS(r)){ // 暴力 
//			cout << "***" << endl;
//			continue;
			for (int i = l; i <= r; i++){
				b[a[i]]++;
				if (b[a[i]] % 2 == 0) res++;
				else if (b[a[i]] > 1) res--;
			}
			for (int i = l; i <= r; i++){
				b[a[i]] = 0;
			}
		}
		else{ // 
			int s = BLS(l) + 1, f = BLS(r) - 1;
			res = ans[s][f];
			for (int i = l; i <= min(BLS(l) * MAXN, n); i++){
				b[a[i]]++;
				int t = b[a[i]] + cnt[a[i]][f] - cnt[a[i]][s - 1];
				if (t % 2 == 0) res++;
				else if (t > 1) res--; 
			} 
			for (int i = f * MAXN + 1; i <= r; i++){
				b[a[i]]++;
				int t = b[a[i]] + cnt[a[i]][f] - cnt[a[i]][s - 1];
				if (t % 2 == 0) res++;
				else if (t > 1) res--;
			}
			for (int i = l; i <= min(BLS(l) * MAXN, n); i++) b[a[i]] = 0;
			for (int i = f * MAXN + 1; i <= r; i++) b[a[i]] = 0;
		}
		cout << res << endl;
	}
	return 0;
} 
2024/1/20 11:40
加载中...