CF1423N - BubbleSquare Tokens 题解

wdnmd 这 tourist 都不会的 3500 题都谁能做出来啊。想了两个小时没想出来,感觉又回到了当年做 connecting cities 的时候,脑子都裂了/ll/ll


Portal

我们考虑归纳构造。假设 \(1\sim i-1\) 号点的诱导子图已经找到一个方案了,那么要把 \(i\) 号点及其连向 \(1\sim i-1\) 号点的边给加进去构成一个新的合法方案。

最保险的显然是要保持 \(1\sim i-1\) 号点的权值都不动,然后让 \(i\) 号点的权值变为它的邻居们所不占有的。我们考虑它的邻居们的权值集合为 \(S\),那么 \(\mathrm{mex}(S)\) 显然是一个合法的权值,且它最小(\(\leq |\delta_i|\)),最容易凑出来。那么如何保持邻居权值不变而让 \(i\) 权值从 \(0\) 增加到 \(\mathrm{mex}(S)\) 呢?对于点上放了一个币的邻居,我们显然可以把它移到与 \(i\) 连接的这条边上,来给 \(i\) 的权值贡献 \(1\)。但是考虑到存在情况,点上放币的邻居个数小于 \(\mathrm{mex}(S)\),那就凑不出来。

不难发现,至此我们的所有边最多只会从不放币到放 \(1\) 个币,那它题面中说可以放 \(2\) 个币是给你吃屁的?考虑如何用上这个条件。我们注意到,「点上放币的邻居个数小于 \(\mathrm{mex}(S)\)」这个情况的本质是,\(i\) 的权值所能达到的值的集合大小 \(\leq\mathrm{mex}(S)\),而 \(\mathrm{mex}(S)\) 最坏情况下可以达到 \(|\delta_i|\),所以避免这个悲剧的一个充分条件是 \(i\) 的权值所能达到的值的集合大小 \(>|\delta_i|\)

于是我们要想办法让每个邻居都有贡献。那些有币的邻居已经有办法贡献了,那么没币的呢?注意到我们只需要扩充这个集合,不一定要「增加」,所以 \(-1\) 也是可以的,所以可以,如果边上有币的话就把它移到点上。这时候这个边的币数量 \(0\sim 2\) 这个条件就派上用场了,可以先把边的初始值赋为 \(1\),这样进亦乐,退亦乐。那么这样显然 \(i\) 号点的可达权值集合大小为 \(|\delta_i|+1\)

但是又有了一个问题,如果边的初始值为 \(1\) 的话,那我归纳过程中新加进来的这些边不就改变原来点的权值了吗?那我是不是在 \(1\sim i-1\) 图中需要刻意构造算上这些边情况下的合法方案呢?那不就相当于归纳有后效性了吗?我们可以类似 DP 中的「费用提前计算」思想,将边权为 \(1\) 作为最最开始的初始条件,然后再来归纳。

(注:上面的推理过程都是扯屁。因为像我这样智商不足的选手,碰到个新题根本不可能逻辑这么通顺地推理。)

code

posted @ 2020-11-22 22:42  ycx060617  阅读(119)  评论(0编辑  收藏  举报