[?] CF1710E Two Arrays

题意

用两个数组 \(a_1,a_2,\ldots,a_n\)\(b_1,b_2,\ldots,b_m\) 描述一个 \(n\times m\) 的网格图,\((i,j)\) 的权值为 \(a_i+b_j\)

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

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

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

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

\(n,m\leq 2\times 10^5\), \(a_i,b_i \leq 5\times 10^8\)

题解

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2022-08-01 20:17  Ilith  阅读(220)  评论(2编辑  收藏  举报