24.11.13

A

this

检查一个 \(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\) 的个数的奇偶性决定当前位。

posted @ 2024-11-14 14:29  KinNa_Sky  阅读(5)  评论(0编辑  收藏  举报