T1 有意思的博弈题
题意:总共有 $n$ 堆石子,第 $i$ 堆石子有 $a_i$ 颗石子,两个人轮流取石子,每个人每次可以选择一堆取走若干个石子,但是不能不取,然后每次取走的石子的数量不能多于上一个人取走的石子的数量,以及第一次取石子取得数量不得多于一个参数 $k$ ,要求判断先手必赢或必败,如果必赢输出所有必胜策略。
一开始没有什么思路,先考虑比较简单的策略,如果石子之和为奇数,那么我一开始直接就随便取走 $1$ 颗石子,然后我就一定能赢,同理,如果和为偶数,我如果一开始取走 $1$ 颗石子,那么我必定输。然后考虑当前的石子的总和是偶数,我一定不会取走奇数颗石子,因为我一旦取走了,后手就变成先手奇数,我必输。因此我一定会取走偶数个石子,同理,到后手也一定会取走偶数个石子,如果不存在能够取走偶数个石子的情况那么后手就输了,不存在能够取走偶数个石子的情况就是每堆都只剩一颗石子。
因此就变成了一个子问题,因为每次一定取走的是偶数,即二的倍数,然后就是每次能取走 $2c$ 颗石子,谁先不能取则输,这就变成了一个子问题,每堆石子除以二下去整,然后又变成了原来的游戏规则,$k$ 也要除二。这样递归下去,就是说只要在 $k$ 的范围能,存在二进制下的某一位有奇数个 $1$ ,那么先手必胜,我挑选最低的那个有奇数个 $1$ 的位,每次选择在那一位下的 $1$ 即可。
形式化的,就是只要 $lowbit(xor_{i=1}^na_i)\le highbit(k)$ 就行了。 考虑输出方案,先把所有数除以某一个值之后变成总和为奇数,我希望能在我减去某一个数之后,在我减去数的 $highbit$ 之内,不存在某一位是奇数个 $1$ 的,即设我在某一个数上减了 $t$ 后,$lowbit((xor_{i\le n}^{i\not=k}a_i)xor~(a_k-t)) > highbit(t)$,因此考虑对于每一个数从小到大枚举 $t$ 的 $highbit$ ,然后每次看看 $highbit$ 这一位是不是 $1$ ,如果是那么给 $a_i$ 减去 $2^{highbit}$ ,因为我减去的话,异或和这一位一定变成零,且因为我是从小到大枚举,我修改高位不会对低位影响,所以小的位都保证是 $0$ ,这个挺妙的。
T2 想过函数键值化,发现不会
但是思路差不多就是dp这样然后推过去,然后分段维护二次函数,%SunZH神仙