0%

2026 杭电春季联赛 4——1004-左右脑互搏

题目大意

题目规则
有两个玩家(左脑先手,右脑后手)进行回合制游戏。
初始给出一个包含 nn 个正整数的多重集合。
每次操作时,玩家必须从集合中删除一个数 xx,且必须满足:xx 严格大于删除该数后集合中剩余元素的异或和。
特别地,若当前集合中只有一个元素,则可以直接将其删去。
无法进行合法操作的玩家判定为失败。
假设双方均采用最优策略,求哪方获胜。

输入格式
第一行包含一个整数 TT1T101 \le T \le 10),表示测试数据的组数。
对于每组测试数据:
第一行包含一个整数 nn1n201 \le n \le 20),表示初始元素的数量。
第二行包含 nn 个正整数,表示初始元素,元素范围 [1,100000][1, 100000]

输出格式
如果左脑(先手)获胜,输出 “Left”,否则输出 “Right”。

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
Input:
3
1
6
4
2 3 6 8
2
2 2

Output:
Left
Right
Right

样例解释第一组数据:集合为 {6}\{6\}。左脑可以直接删除唯一的一个元素,获胜。
第二组数据:集合为 {2,3,6,8}\{2, 3, 6, 8\}

  • 左脑只能先删除 8(此时剩余元素异或和为 236=72 \oplus 3 \oplus 6 = 7,满足 8>78 > 7)。

  • 右脑只能再删除 6(此时剩余元素异或和为 23=12 \oplus 3 = 1,满足 6>16 > 1)。

  • 左脑只能再删除 3(此时剩余元素异或和为 22,满足 3>23 > 2)。

  • 右脑面对唯一的元素 2,最后将其删去,获胜。

第三组数据:集合为 {2,2}\{2, 2\}。左脑如果尝试删除其中一个 2,删除后剩余元素的异或和为 2,不满足 2>22 > 2 的条件。因此左脑无法删除任何元素,右脑直接获胜。

思路讲解

PDF

image

其实也没什么为什么需要记忆化搜索,进行状态压缩。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int dfs(ll sta) {
if (memo[sta] != -1) {
return memo[sta];
}
int res = 0;
ll xorSum = 0;
for (int i = 0; i <= __lg(sta); ++i) {
if (sta >> i & 1) {
xorSum ^= A[i];
}
}
for (int i = 0; i <= __lg(sta); ++i) {
if (sta >> i & 1) {
if (A[i] > (xorSum ^ A[i])) {
res |= dfs(sta - (1ll << i)) ^ 1;
}
}
}
memo[sta] = res;
return memo[sta];
}

AC代码

AC
https://acm.hdu.edu.cn/contest/view-code?cid=1200&rid=13297

心路历程(WA,TLE,MLE……)