[?] CF1710E Two Arrays
题意
用两个数组 、 描述一个 的网格图, 的权值为 。
一开始有个车位于 ,Alice 和 Bob 轮流操作,一次操作可以选择:
- 横向移动车至与其同一行的任意一个格子;
- 纵向移动车至与其同一列的任意一个格子;
- 结束游戏。
特别地,不能将车移动至一个已经被踩过 次的格子,最后局面的权值即为车所在格子的权值。
Alice 想最大化,Bob 想最小化,两人均最优策略,问最后的权值。
, 。
题解
首先二分答案 ,那么 Alice 一旦遇到比 大的局面就会立刻结束,Bob 同理。那么我们把格子按照权值, 的为白色, 的为黑色,也就是说,Alice 只能走白格,Bob 只能走黑格,谁走不动谁输。
那么我们可以建立二分图博弈模型:将每个点复制为 份,向能够一步到达的所有异色点连边,问题就变成规定起点,两人轮流走一步,走不动的输。
二分图博弈的结论是,最大匹配一定包含起点时先手胜,反之则反。证明:
-
最大匹配包含起点,先手只需要一直走最大匹配中的边。若后手走到一个未匹配的点,那么我们把最大匹配中先手走过的边,换成后手走过的边,此匹配就不包含起点了,矛盾。
-
最大匹配不包含起点,则先手第一步一定会走到最大匹配中的点(否则在原最大匹配的基础上,新增一组先手走的边),然后变成了第一种情况,后手必胜。
然后假设说我们对这个复制后的图求出了最大匹配,可以发现一定存在一种方式将图分为 层,一层含有每个点的一份复制,且不存在跨层的匹配(这里感性吧,我不太会说话),所以 个复制和一个点没有本质区别,这两个图答案相同。问题转化为判断上述二分图的最大匹配是否一定包含起点。
简单的想法是删去起点后,再跑一遍最大匹配检查是否相等。而最大匹配在网格图上的形式不是很好看,我们转而求最大独立集:在网格中选择最多的格子,使得同行同列不存在异色格子都被选中。
那对于一行/列,我选择的格子只能是一个颜色,那么我就可以对行列进行黑白染色,也就是可以称一行/列是白/黑的,当且仅当这一行/列我只能选中白/黑格子。那么:
- 白行与白列的交,如果是白格子则贡献为 。
- 黑行与黑列的交,如果是黑格子则贡献为 。
- 白行与黑列、白列与黑行的交,没有贡献。
则最大独立集为,与其所在行列均同色的格子数。
观察到我可以将 数组排序,这样起点变成了中间任一点,而白格挪到了右上角一部分,好处就是白行/列选择的一定是一个后缀。假设前 行是白行,前 列是白列,我固定 从右往左扫描 ,相当于每次把一个黑列替换为白列。假设这列有 个白格,贡献即为 ,容易发现 随着 递增,换句话说答案关于 有凸性,决策在第一个 的点。这个点的位置关于 也是单调的,所以可以双指针 对于每个 找出。至此我们解决了不删除起点的部分。
删去起点的部分是平凡的,方法一致,至此我们 解决了这题。
另外,我知道若干天后的模拟赛会搬考这道题,为什么呢,因为数据就是我造的,所以这算不算造福社会了?[doge]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端