[ABC368E] Train Delay 题解
前言
笑点解析:
思路
一种很新的建图 trick,看完题解你会发现这题的思想和 [ABC232G] Modulo Shortest Path 一模一样。
先想缩小数据范围怎么做。题意相当于一堆形如 的不等式,给定 ,要求最小的一组解。如果点数 缩小到 ,这就是一个差分约束跑最长路的经典问题,直接暴力从每个 向 连边建图跑最长路然后输出答案即可,边数为 级别,但有一个很好的性质就是题目保证 ,差分约束边权全部为非正值,可以不用跑 spfa,使用复杂度为 的 Dijkstra 求解即可。关于跑最长路能最小化解的正确性不再赘述,感性理解一下最短路算法的松弛过程即可。
我们发现这个做法的瓶颈主要在于图上的边数,如果能把边数缩小到 级别就好了。观察连边过程,我们发现如果将所有 相等的 放在一起按 排序,那么每次从 向 连边都是在 的所有 中挑一段后缀连边。这启示我们使用后缀和优化建图。具体的,在图上新建 个虚点,对于每一堆 相等的 ,都连上 和 两条有向边,这样对于每个 就只用二分最小的满足 的 ,连边 即可。
但是问题还没有解决。刚刚的优化建图方式边数为 ,但边权存在正负两种值,只能跑复杂度 的 spfa。由于跑的是最长路,考虑怎么把边权全部转化为负值,这样就可以在全负权图上跑 Dijkstra 了。挖掘“后缀和优化建图”的性质,我们发现一件神奇的事情:如果将所有 的权值改为 的差分,由于差分的后缀和就是原序列,我们就可以直接凑出每个 !把边权修改为下图的形式,由于 从小到大排序,且保证 ,现在图上的边权已经全为负数了。
于是这题我们就做完了,时间复杂度 。
代码
link,赛时差分约束写错源点调了一百年,结束后五分钟才过的代码,写的很丑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Misaka's Blog!
评论
re