atcoder ABC395 部分题解

E - Flip Edge

题意

给定有向图,边权均为 \(1\),可以随时翻转所有图的边的方向,每次花费 \(x\),求 \(1\)\(n\) 的最短花费。

题解

之前看成单边翻转了。。

每个点拆成两个点,为原图和反转图,边 \((u,v)\) 即为原图的有向边 \((u,v)\) 和反转图的有向边 \((v,u)\)

最后每个点到自己反转图的点连一个长度为 \(x\) 的双向边即可。

参考代码

F - Smooth Occlusion

题意

给定 \(a_n,b_n\),每次操作选择一个 \(a_i\) 或者 \(b_i\) ,令其减 \(1\),最终保证 \(|a_i-a_{i+1}| \leq X\)\(a_i+b_i\) 都相同,最小操作次数是多少。

题解

不考虑 \(X\) 的限制,我们确定一个最终的 \(H\) 为所有的 \(a_i+b_i\),这个 \(H\) 就是最小的 \(a_i+b_i\)

\(H\) 减小时,我们的操作数会变大,但对 \(X\) 的限制就越宽松,我们可以二分这个 \(H\),检查时确定 \(i-1\)\(a_i\) 能变成的区间 \([l_{i-1},r_{i-1}]\) ,那新的区间就是 \([l_{i-1}-x,r_{i-1}+x]\)\([l_i,r_i]=[a_i-w,a_i]\) 的交区间,其中 \(w\) 是当前 \(H\)\(a_i\) 最多能操作多少次。

参考代码

G - Minimum Steiner Tree 2

题意

给定无向完全图,每次询问两点 \(u,v > K\) ,求保证使点 \(1,2 \cdots K, u,v\) 连通的最小子图边权和。

\(n \leq 80, Q \leq 5000, k \leq 8\)

题解

是最小斯坦纳树的小扩展,不了解的可以先学习一下。

如果每次询问都从头求斯坦纳树,复杂度为 \(O(Q 3^k)\) ,做不了。

\(n\) 很小,每个询问给定了两个额外点,我们尝试先求过一个额外点的斯坦纳树,再加入另一个点。

具体的,设 \(f_{u,rt,s}\) 为以 \(rt\) 为根下,包含 \(s \cup \{u\}\) 的点集的最小斯坦纳树,求出的这棵树保证 \(s,rt,u\) 这些点连通,我们直接连通 \(rt\)\(v\) 的最短路就连接了 \(v\) 点,显然不同的 \(rt\) 代价不同,选择最小的 \(rt\) 即可。

\(u,v\) 是对称的,只枚举一个先选就行,复杂度 \(O(n3^n \log n+Qn)\),提前求出全源最短路,转移更方便。

参考代码

posted @ 2025-03-05 21:35  蒻蒻虫  阅读(34)  评论(0)    收藏  举报