跳到主要内容

博弈与计算几何

本节目标

用异或不变量、区间投影和规范化表示处理离散数学应用。

识别信号

这三题没有统一的代码模板。矩形题要把二维关系拆成坐标投影;Nim 要寻找胜负不变量;共线点要让同一条直线获得唯一表示。共同点是先抛开表面操作,明确什么量必须被保持、什么对象必须规范化。

核心定义与不变量

两个轴对齐矩形有正面积交集,当且仅当 x、y 两个一维投影都严格重叠。普通 Nim 的异或和为零恰是必败态。对固定锚点,任意两点的方向向量经最大公约数约分和符号统一后,是共线关系的稳定键。

朴素方法与瓶颈

枚举矩形内部点、搜索所有游戏后继、对每组三点检查共线,都会引入不必要的规模。投影把二维判断降成常数次比较;异或一次汇总所有石子堆;固定一个点并统计规范化斜率把三重枚举降到二重。

推导与实现框架

先从定义写出可验证条件。矩形以 max(left) < min(right) 判断每个轴;Nim 累计 XOR;直线题对每个锚点统计 (dx, dy),先处理重复点,再约分、统一垂直线、水平线和整体符号。没有必要把它们强行归成一种算法。

复杂度与数值边界

矩形重叠为 O(1),Nim 为 O(n)。直线题中,C++ 使用 std::map,时间复杂度为 O(n²(log C + log n));Python 使用哈希表,平均为 O(n² log C),其中 log C 来自 GCD。坐标差和 GCD 计算使用足够宽的整数;投影相接时长度为零,不是重叠;重复点不应参与零向量约分。

母题序列

  1. 矩形重叠必学):从二维坐标进入严格区间相交。
  2. Nim 游戏拓展):建立异或和的胜负不变量。
  3. 直线上最多的点数拓展):用规范化方向统计共线点。

常见误区

  • 把边界接触当作矩形“重叠”,忽略正面积要求。
  • 把 Nim 的石子总数或奇偶性当作判据。
  • 用浮点斜率作哈希键,或让等价斜率拥有不同符号。
  • 遇到重复点直接计算 GCD,产生 (0, 0) 的无意义方向。

迁移方向

不变量可迁移到其他有限游戏,规范化键可迁移到分数、向量和几何哈希,投影可迁移到区间和盒体相交。本栏不继续扩展 SG 函数、Nim 变体或凸包等高级计算几何。