疑惑
查看原帖
疑惑
939431
szh_AK_alldevotion楼主2024/10/31 12:26

为什么我这个代码可以得到 20pts20pts

#include <bits/stdc++.h>
using namespace std;
int aa[100005], a[100005], c[100005], xx[5];
int zhi, K;
int now[100005], sh[35][35];
int d[35][100005], can[100005];

void dfs(int r, int g) {
	if (r == K + 1) {
		can[now[1]] = 1;
		return;
	}
	if (g == (1 << (K - r)) + 1) {
		for (int i = 1; i < g; i++)
			now[i] = sh[r][i];
		dfs(r + 1, 1);
		return;
	}
	int xu1 = now[2 * g - 1], xu2 = now[2 * g];
	if (d[r][g] == 0) {
		if (!(xu1 <= zhi && a[xu1] >= r)) {
			sh[r][g] = xu2;
			dfs(r, g + 1);
		}
		if (xu1 <= zhi && a[xu1] < r)
			return;
		sh[r][g] = xu1;
		dfs(r, g + 1);
	} else {
		if (!(xu2 <= zhi && a[xu2] >= r)) {
			sh[r][g] = xu1;
			dfs(r, g + 1);
		}
		if (xu2 <= zhi && a[xu2] < r)
			return;
		sh[r][g] = xu2;
		dfs(r, g + 1);
	}
}

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> aa[i];
	for (int i = 1; i <= m; i++)
		cin >> c[i];
	K = 0;
	while ((1 << K) < n)
		K++;
	for (int i = 1; i <= K; i++) {
		for (int j = 1; j <= (1 << (K - i)); j++) {
			char cc;
			cin >> cc;
			d[i][j] = cc - '0';
		}
	}
	int t;
	cin >> t;
	while (t--) {
		for (int i = 0; i <= 3; i++)
			cin >> xx[i];
		for (int i = 1; i <= n; i++)
			a[i] = aa[i] ^ xx[i % 4];
		int ans = 0;
		for (int i = 1; i <= m; i++) {
			zhi = c[i];
			K = 0;
			while ((1 << K) < c[i])
				K++;
			if (K == 0) {
				ans ^= i;
				continue;
			}
			for (int j = 1; j <= (1 << K); j++)
				now[j] = j;
			dfs(1, 1);
			int tmp = 0;
			for (int j = 1; j <= (1 << K); j++) {
				tmp += j * can[j];
				can[j] = 0;
			}
			ans ^= (i * tmp);
		}
		cout << ans << "\n";
	}
}

其中的 shsh 数组用来记录第几轮第几场的胜者,我数组只开到了 3535,为什么 n=500n=500 的点没 RE

2024/10/31 12:26
加载中...