CF1936C Pokémon Arena 题解

· · 题解

有个较为显然的结论:

证明:假设相邻两次操作中,先用 yi 属性打败了 x,再用 zi 属性打败了 y,那么直接用 zi 属性打败 x 可以节省 c_y 的雇佣费,并且后者所需要提升的能力值不多于前者,即后者一定更优。

于是用 yi 属性打败 x 所需提升的能力值永远是 \max(0,a_{y,i}-a_{x,i}),因为根据结论 a_{x,i} 不会在前面的操作中被修改。

先直接建出图。图上点 x 的权值为雇佣费 c_x。从点 x 向点 ym 条有向边,其中第 i 条的边权为 \max(0,a_{y,i}-a_{x,i})。一条 1n 的路径长度为路径上边权与除 c_1 外所有点权的总和。于是原题就转化成了一个最短路问题。

带着点权做并不方便。可以考虑将一个点拆成入点和出点,从入点向出点连权值为 c_x 的边。这样就把点权转成了边权。

直接这样做有 \Theta(n^2m) 条边,不可接受,需要优化。

m 个属性值分开考虑。由于 xy 的边权为两者对应属性值的差,显然可以按属性值对 n 个点排序,每个点只向相邻的点连边。这样单层的边数就变成 了 \Theta(n),一共 m 层。

简单总结一下:

点数与边数均为 \Theta(nm) 级别。

建完图直接跑最短路即可。

完整赛时 AC 代码。