24.11.13
A
检查一个 \(n\) 是否后手必胜:
首先把所有除掉(二进制)末尾 \(0\) 之后相同的数分为一组,每组分别考虑。现在的问题是:有若干个游戏,每个游戏有 \(n\) 堆石子,每堆分别有 \(0,1,\cdots,n-1\) 个石子,每次的操作是选一堆石子,假设它有 \(x\) 个,那么你可以拿走其中 \(c\) 个,\(c\in[1,x]\)。如果存在一堆石子数量 \(y=x-c\),那么把 \(x\) 和 \(y\) 都拿走。要求这个游戏的 SG 函数,如果所有游戏的 SG 函数的异或和为 \(0\),那么后手必胜。
如果没有把 \(x,y\) 都拿走这个操作,这个游戏就是 Nim 游戏。注意到 \(x-c=y\),\((x-c)\oplus y=0\),拿走他们并不会影响异或和。所以可以把问题视为没有把 \(x,y\) 都拿走这个操作,因为这个操作并不影响这个游戏的 SG 函数,这样这个游戏的 SG 函数就是 \(\oplus_{i=0}^{n-1}i\)。
令 \(f(x)\) 表示 \(x\) 二进制下末尾 \(0\) 的个数,整个游戏的 SG 函数是 \(\oplus _{i=1}^nf(i)\),而 \(f(i)=j\) 的 \(i\) 的数量是 \(\lfloor\frac{n}{2^j}\rfloor-\lfloor\frac{n}{2^{j+1}}\rfloor\),我们只关心这个值的奇偶性,也就是我们只关心 \(n\) 的二进制下第 \(j\) 位和第 \(j+1\) 位是否相同。
首先二分答案 \(mid\),求出 \(\le mid\) 的有多少个 \(n\) 满足后手必胜。然后数位 DP,设 \(f_{i,j,s,flag}\) 分别表示从高到低填完了 \(i\) 位,第 \(i\) 位填的是 \(j(j\in\{0,1\})\),现在的异或和是 \(s\),前 \(i\) 位是否顶 \(mid\) 的上界。状态数 \(O(\log^2 n)\),转移 \(O(1)\)。加上二分,总复杂度 \(O(T\log^3 n)\)
B
拼尽全力无法战胜
C
this
拼尽全力无法战胜
P2048
坏了。每一小部分都会写,但是拼一块完全想不到/kk
首先做前缀和,然后考虑每个位置作为左端点的时,合法的右端点是一段区间,那么找到区间最大值就能知道每个位置作为左端点的合法最大值。
设左端点为 \(p\),区间为 \([l, r]\),最大值下标为 \(t\),在 \([p, t]\) 记过贡献后,区间其他点仍能与 \(p\) 构成合法区间,也就是 \(p\) 与 \([l, t - 1],[t + 1, r]\)。
用堆维护所有 \((p, [l, r])\) 的最大值,取出 \((p, [l, r])\) 后再把 \((p, [l, t - 1])\) 和 \((p, [t + 1, r])\) 塞进去,取前 \(k\) 个求和。
被迫加练两道博弈轮
AT_arc137_c
可以看成一行棋盘,每次选最右棋子放到左侧任一空位。
然后自己手玩了几局,发现:
- 必败态是 \(n\) 个间隙都为 \(0\)。
- 每次决策,如果最后间隙不为 \(0\),可以选择只把最后间隙变为 \(0\)。
- 每次决策,可以选择删去最后间隙,并选择左侧一个大于 \(0\) 的间隙减一并拆成两个非负整数。
然后隐隐约约可以猜到必败条件是最后间隙为 \(0\) 且左侧间隙 \(sum\) 为偶数。
怎么猜到的就是手玩的时候发现上述决策 2 会改变奇偶性;如果最后间隙不为 \(0\) 总可以把局面转化成最后间隙为 \(0\) 且左侧间隙 \(sum\) 为偶数。
然而有更为简单的结论就是:
\(S \to T\) 表示 \(S\) 状态可到达 \(T\)。
若 \(\exists T, S \to T, \forall T \to P, \text{都有 } S \to P\),则 \(S\) 为必胜态。证明,若 \(T\) 为必败态,则 \(S \to T\),\(S\) 必胜,否则一定 \(\exists P,T \to P, \text{且 } P \text{ 必败}\),则有 \(S \to P\),\(S\) 必胜。
所以如果最后间隙不为 \(0\),那么将最后间隙变成 \(0\),前后两个状态满足上述关系,所以只要最后间隙不为 \(0\) 则必胜。
如果最后间隙为 \(0\),由于接下来的局面一定不会转移到上述必胜态,所以最后两人轮番把最后一个棋子放到最右能放空位,那么局面的奇偶性即为答案。
AT_arc151_c
SG 函数。
显然每个极长空段之间无关,看作多个游戏。
但是每个空段会受到左右限制。那么写成多个 \(SG\) 函数。
- \(SG_1(x)\):左右无限制;
- \(SG_2(x)\):有一侧无限制;
- \(SG_3(x)\):两侧同色;
- \(SG_4(x)\):两侧异色。
那么有:
- \(SG_1(0) = 0, SG_2(0) = 0, SG_3(0) = 1, SG_4(0) = 0\),其中 \(SG_3(0)\) 非法,如果转移到这种局面则失败,故看作先手必胜;
- \(SG_1(x) = \operatorname{mex}_{i=1}^x\{SG_2(i - 1)\oplus SG_2(x - i)\}\);
- \(SG_2(x) = \operatorname{mex}_{i=1}^x\{SG_2(i - 1)\oplus SG_3(x - i),SG_2(i - 1)\oplus SG_4(x - i)\}\);
- \(SG_3(x) = \operatorname{mex}_{i=1}^x\{SG_3(i - 1)\oplus SG_3(x - i),SG_4(i - 1)\oplus SG_4(x - i)\}\);
- \(SG_4(x) = \operatorname{mex}_{i=1}^x\{SG_3(i - 1)\oplus SG_4(x - i)\}\)。
那么归纳得:
- \(SG_1(x) = x \bmod 2\);
- \(SG_2(x) = x\);
- \(SG_3(x) = 1\);
- \(SG_4(x) = 0\)。
P4162
【模板】 01bfs
P5874
如果在某一天卖完后剩了以后卖,说明这些马在以后的价值更高,由于这一天所有马一样,所以所有马在以后卖价值更高,所以最优一定是某一天卖出所有马。
所以现在要求 \(\max_{i = 1}^n\left(\left(\prod_{j = 1}^i X_j\right) \cdot Y_i\right)\)。
乘积很大,考虑取 \(\log\) 就变成加法了,线段树维护区间加全局 \(\max\),算答案再用树状数组维护前缀积。
P2894 / P3071
一开始以为不能只维护最长连续段。
其实维护最长连续段然后在线段树上能往左走就往左走就可以了。
判断先左再中再右。
AT_arc158_c / CF1322B
不是很双倍经验,但是思想差不多。
AT:
考虑两数相加的数位和和两数数位和相加的关系:如果发生进位则减 \(9\)。
那么答案是所有数位和 \(\times 2n\) 减去进位次数 \(\times 9\)。
然后在第 \(i\) 位发生进位当且仅当两数后 \(i\) 位的和 \(\ge 10^{i + 1}\)。
用桶把所有后 \(i\) 位存起来就是求大于等于某个数的个数,二分找一下。
CF:
从低到高逐位确定答案。
异或等于不进位加法,所以从后面进位上来的值可以异或进当前答案。
那么知道某一位上本身算了多少 \(1\) 是简单的,
后面有多少 \(1\) 进位上来和上面一样算,这里是二进制。
根据 \(1\) 的个数的奇偶性决定当前位。