CF1936C Pokémon Arena 题解
有个较为显然的结论:
- 任意最优方案中,相邻两次 2 操作中的
j 不同。
证明:假设相邻两次操作中,先用
y 的i 属性打败了x ,再用z 的i 属性打败了y ,那么直接用z 的i 属性打败x 可以节省c_y 的雇佣费,并且后者所需要提升的能力值不多于前者,即后者一定更优。
于是用
先直接建出图。图上点
带着点权做并不方便。可以考虑将一个点拆成入点和出点,从入点向出点连权值为
直接这样做有
将
简单总结一下:
- 一共有
n 个出点,以及m 层入点,每层n 个; - 每层的入点之间,从小点向大点连边权为两者之差的边,从大点往小点连边权为
0 的边,只对 rank 相邻的点加边即可; - 点
x 对应的m 个入点均向出点连一条权值c_x 的边; - 每个出点向其对应的所有入点连一条边权为
0 的边,这是因为优化建图后可以直接走入点间的连边。
点数与边数均为
建完图直接跑最短路即可。
完整赛时 AC 代码。