萌新求助 MLE 的分块
  • 板块P4135 作诗
  • 楼主SIXIANG32
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/3/26 16:57
  • 上次更新2023/10/28 05:32:27
查看原帖
萌新求助 MLE 的分块
298549
SIXIANG32楼主2022/3/26 16:57
#include <iostream>
#include <algorithm>
#include <cmath>
#define MAXN 120000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n, m, CCC, cnt;
int a[MAXN + 10];
int pl[MAXN + 10], pr[MAXN + 10], cl[MAXN + 10], len;
int c[50 + 10][50 + 10][MAXN + 10];
int f[50 + 10][50 + 10];
int ans;
void qwq(int l, int r, int num) {
	if(c[l][r][num] == 0) {c[l][r][num]++; return ;}
	else if(c[l][r][num] % 2 == 0) ans--;
	else ans++;
	c[l][r][num]++;
}
int solve(int l, int r) {
	int L = cl[l], R = cl[r];
	int x = 0, y = 0;
	if(L + 1 <= R - 1) x = L + 1, y = R - 1;
	ans = f[x][y];
	if(L == R) {
		for(int p = l; p <= r; p++) qwq(x, y, a[p]);
		for(int p = l; p <= r; p++) c[x][y][a[p]]--;
	}
	else {
		for(int p = l; p <= pr[L]; p++) qwq(x, y, a[p]);
		for(int p = pl[R]; p <= r; p++) qwq(x, y, a[p]);
		for(int p = l; p <= pr[L]; p++) c[x][y][a[p]]--;
		for(int p = pl[R]; p <= r; p++) c[x][y][a[p]]--;
	}
	return ans;
}
void block() {
	len = pow(double(n), 0.666666);
	for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
		pl[p] = (p - 1) * len + 1;
		pr[p] = p * len;
	}
	for(int p = 1; p <= n; p++)
		cl[p] = (p - 1) / len + 1;
	for(int p = 1; p <= ceil(n * 1.0 / len); p++)
		for(int i = p; i <= ceil(n * 1.0 / len); i++) {
			for(int j = pl[p]; j <= pr[i]; j++) c[p][i][a[j]]++;
			for(int j = 0; j <= CCC; j++)
				if((c[p][i][j] % 2 == 0) && c[p][i][j]) f[p][i]++;
		}
}
int main() {
	//freopen("test.txt", "r", stdin);
	//freopen("taxt.txt", "w", stdout);
	cin >> n >> CCC >> m;
	for(int p = 1; p <= n; p++) cin >> a[p];
	block();
	int last = 0;
	while(m--) {
		int x, y;
		cin >> x >> y;
		x = (x + last) % n + 1, y = (y + last) % n + 1;
		if(x > y) swap(x, y);
		last = solve(x, y);
		cout << last << endl;
	}
}

问题就在于,这玩意儿 MLE 了/kk

2022/3/26 16:57
加载中...