wdnmd 这 tourist 都不会的 3500 题都谁能做出来啊。想了两个小时没想出来,感觉又回到了当年做 connecting cities 的时候,脑子都裂了/ll/ll
我们考虑归纳构造。假设 (1sim i-1) 号点的诱导子图已经找到一个方案了,那么要把 (i) 号点及其连向 (1sim i-1) 号点的边给加进去构成一个新的合法方案。
最保险的显然是要保持 (1sim 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) 的权值所能达到的值的集合大小 (leqmathrm{mex}(S)),而 (mathrm{mex}(S)) 最坏情况下可以达到 (|delta_i|),所以避免这个悲剧的一个充分条件是 (i) 的权值所能达到的值的集合大小 (>|delta_i|)。
于是我们要想办法让每个邻居都有贡献。那些有币的邻居已经有办法贡献了,那么没币的呢?注意到我们只需要扩充这个集合,不一定要「增加」,所以 (-1) 也是可以的,所以可以,如果边上有币的话就把它移到点上。这时候这个边的币数量 (0sim 2) 这个条件就派上用场了,可以先把边的初始值赋为 (1),这样进亦乐,退亦乐。那么这样显然 (i) 号点的可达权值集合大小为 (|delta_i|+1)。
但是又有了一个问题,如果边的初始值为 (1) 的话,那我归纳过程中新加进来的这些边不就改变原来点的权值了吗?那我是不是在 (1sim i-1) 图中需要刻意构造算上这些边情况下的合法方案呢?那不就相当于归纳有后效性了吗?我们可以类似 DP 中的「费用提前计算」思想,将边权为 (1) 作为最最开始的初始条件,然后再来归纳。
(注:上面的推理过程都是扯屁。因为像我这样智商不足的选手,碰到个新题根本不可能逻辑这么通顺地推理。)