[?] CF1710E Two Arrays

题意

用两个数组 a1,a2,,anb1,b2,,bm 描述一个 n×m 的网格图,(i,j) 的权值为 ai+bj

一开始有个车位于 (1,1),Alice 和 Bob 轮流操作,一次操作可以选择:

  1. 横向移动车至与其同一行的任意一个格子;
  2. 纵向移动车至与其同一列的任意一个格子;
  3. 结束游戏。

特别地,不能将车移动至一个已经被踩过 1000 次的格子,最后局面的权值即为车所在格子的权值。

Alice 想最大化,Bob 想最小化,两人均最优策略,问最后的权值。

n,m2×105, ai,bi5×108

题解

首先二分答案 x,那么 Alice 一旦遇到比 x 大的局面就会立刻结束,Bob 同理。那么我们把格子按照权值,x 的为白色,x 的为黑色,也就是说,Alice 只能走白格,Bob 只能走黑格,谁走不动谁输。

那么我们可以建立二分图博弈模型:将每个点复制为 1000 份,向能够一步到达的所有异色点连边,问题就变成规定起点,两人轮流走一步,走不动的输。

二分图博弈的结论是,最大匹配一定包含起点时先手胜,反之则反。证明:

  • 最大匹配包含起点,先手只需要一直走最大匹配中的边。若后手走到一个未匹配的点,那么我们把最大匹配中先手走过的边,换成后手走过的边,此匹配就不包含起点了,矛盾。

  • 最大匹配不包含起点,则先手第一步一定会走到最大匹配中的点(否则在原最大匹配的基础上,新增一组先手走的边),然后变成了第一种情况,后手必胜。

然后假设说我们对这个复制后的图求出了最大匹配,可以发现一定存在一种方式将图分为 1000 层,一层含有每个点的一份复制,且不存在跨层的匹配(这里感性吧,我不太会说话),所以 1000 个复制和一个点没有本质区别,这两个图答案相同。问题转化为判断上述二分图的最大匹配是否一定包含起点。

简单的想法是删去起点后,再跑一遍最大匹配检查是否相等。而最大匹配在网格图上的形式不是很好看,我们转而求最大独立集:在网格中选择最多的格子,使得同行同列不存在异色格子都被选中。

那对于一行/列,我选择的格子只能是一个颜色,那么我就可以对行列进行黑白染色,也就是可以称一行/列是白/黑的,当且仅当这一行/列我只能选中白/黑格子。那么:

  • 白行与白列的交,如果是白格子则贡献为 1
  • 黑行与黑列的交,如果是黑格子则贡献为 1
  • 白行与黑列、白列与黑行的交,没有贡献。

则最大独立集为,与其所在行列均同色的格子数。

观察到我可以将 a,b 数组排序,这样起点变成了中间任一点,而白格挪到了右上角一部分,好处就是白行/列选择的一定是一个后缀。假设前 i 行是白行,前 j 列是白列,我固定 i 从右往左扫描 j,相当于每次把一个黑列替换为白列。假设这列有 x 个白格,贡献即为 min(nx,ni)+min(x,i)=x+in,容易发现 x 随着 j 递增,换句话说答案关于 j 有凸性,决策在第一个 x+in>0 的点。这个点的位置关于 i 也是单调的,所以可以双指针 O(n) 对于每个 i 找出。至此我们解决了不删除起点的部分。

删去起点的部分是平凡的,方法一致,至此我们 O(nlogv) 解决了这题。

另外,我知道若干天后的模拟赛会考这道题,为什么呢,因为数据就是我造的,所以这算不算造福社会了?[doge]

posted @   Ilith  阅读(236)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示