为什么我这个代码可以得到 20pts
#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";
}
}
其中的 sh 数组用来记录第几轮第几场的胜者,我数组只开到了 35,为什么 n=500 的点没 RE