Out on my own.|

园龄:粉丝:关注:

📂题解
🔖差分
2024-01-28 22:06阅读: 48评论: 0推荐: 0

ABC338D 题解

赛时怎么连这题都不会。再不练练思维真的就连普及题都不会做了啊。

Solution

题目来源:ABC338D(in Atcoder | in 洛谷)。

不妨先考虑应该断掉哪条边。首先我们发现,仅断掉一条边并不会让两个结点不可达,只会让我们从一个结点绕更远的路到达目标结点。

如果我们要从结点 u 前往结点 v(假设 u<v),无非就两条路径(重复走过某条边无意义):沿着 u 走过若干个 uv 的结点;从 u 走到 1,绕到 n 再走到 u。这两条路径经过的边数都很好算。前者为 (vu) 条,后者为 [(u1)+(nv)+1]=(u+nv) 条。

记两路径的边数差为 r=|(vu)(u+nv)|=|2u+2vn|。我们钦定走边数少的路径,如果断掉该路径上的任意一条边,我们都会绕另一条路,多走 r 条边。所以我们可以认为 该路径上的边被断掉的代价为 r。那么对于每组路径要求,我们可以直接离线地在环上差分,让该路径上所有边代价整体 +r,再在最后用前缀和求出每条边被断掉的总代价。

最后只需断掉总代价最小的边即可。答案即为 所走过的最短路径之和 加上 最小代价 rmin

断环为链地实现差分和前缀和即可。实现时注意以下几点:

  • long long。打擂台取 min 时上界不要开小。
  • 不要混淆边的编号和点的编号。

code

本文作者:Running-a-way

本文链接:https://www.cnblogs.com/Running-a-way/p/17993522/sol-abc338d

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Running_a_way  阅读(48)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起