AGC002E
有 \(n\) 堆糖果,第 \(i\) 堆有 \(a_i\) 颗。有两个玩家,每个回合玩家可以拿掉剩余糖果数量最多的一堆或者拿走所有糖果堆中的一颗。拿到最后一颗糖果的玩家输了,问先手必胜还是后手必胜。
\(n \le 10^5, a_i \le 10^9\)。
将 \(a_i\) 从大到小排序,每次等于删掉最底下的一行或者最左边的一列。
5 3 2 2
O
O
O O
O O O O
O O O O
也就是从 \((1, 1)\) 出发每次可以向右/向上走,不能走的输。
设 \(f_{i, j} = 0 / 1\) 表示走到 \((i, j)\) 时先手必胜还是后手必胜。如果 \(f_{i, j} = [f_{i, j + 1} == 0 \ || \ f_{i + 1, j} == 0]\)
这时侯就需要开始找点规律了,规律是 \(f_{i, j} = f_{i + 1, j + 1}\)。证明:
- 若 \(f_{i, j} = 1\),不妨设 \(f_{i, j + 1} = 0\),那么 \(f_{i + 1, j + 1} = 1\)。
- 若 \(f_{i, j} = 0\),则 \(f_{i, j + 1} = f_{i + 1, j} = 1\), \(f_{i + 1, j + 1}, f_{i + 2, j}\) 中至少有一个 \(0\),只能是 \(f_{i + 2, j} = 0\),那么 \(f_{i + 2, j + 1} = 1\),同理:\(f_{i + 1, j + 2} = 1\),也就得到 \(f_{i + 1, j + 1} = 0\)。
所以从 \((1, 1)\) 往右上走到极限,接下来只能选择一个方向走到底,这是容易算的。
时间复杂度:\(O(n \log n)\)。
找规律神仙题,证明不难,想推出来不易。
浙公网安备 33010602011771号