首页 > 其他 > 详细

Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round)

时间:2021-06-03 23:49:06      阅读:36      评论:0      收藏:0      [点我收藏+]

C. Skyline Photo *2100

给定长度为 \(n\) 的数组 \(h, b\),现在将这个数组划分为连续的若干段,每一段的价值为 \(h\) 最小的那个位置对应的 \(b\),求出最大化的价值和。

\(1 \le n \le 3 \times 10^5\)\(1 \le h_i \le n\)\(|b_i| \le 10^9\)


写出 DP 方程式,显然为:

\[f_i = \max_{j < i} \{ f_j + w(j + 1, i)\} \]

这是一个经典的形式。注意到因为 \(w(j + 1, i)\) 取决于 \(h_{j + 1} \sim h_i\) 之间的最小值,所以 \(w\) 可以分为若干段,每一段都是相同的。

用一个单调栈来维护这样的段,段内记录最小值所在的点,以及 \(\max f\) 即可。

时间复杂度 \(O(n)\)

Code

D. Useful Edges *2400

给定一张 \(n\) 个点的无向图,以及 \(q\) 个三元组 \((u, v, l)\)。一条边 \(e\) 被定义为「有用的」当且仅当存在一个三元组 \((u, v, l)\),以及一条路径,满足:

  • \(u\)\(v\) 是路径的端点。
  • \(e\) 在路径上。
  • 路径的边权和 \(\le l\)

数出图中的「有用的」边的数量。

\(2 \le n \le 600\)\(0 \le m \le \frac{n(n - 1)}{2}\)\(1 \le q \le \frac{n(n - 1)}{2}\)\(1 \le w, l \le 10^9\),图中没有重边和自环,三元组的 \(u, v\) 也互不相同。


首先求一遍 Folyd 得到两两点之间的最短路。

现在我们锁定一个点 \(v\),关注所有与 \(v\) 之间相连的三元组 \((u_i, v, l_i)\)

\(e = (a, b, w)\) 是有用的当且仅当存在一个三元组满足:

\[{\rm dist}(v,a) + w + {\rm dist}(b, u_i) \le l_i \Leftrightarrow ?l_i +{\rm dist}(u_i,b) \le ? w ? {\rm dist}(v,a) \]

发现等号右边仅仅和 \(v\) 以及边本身有关,所以最小化左边即可。

具体的,对于 \((u_i, v, l_i)\),将 \(d_{u_i} \gets -l_i\),然后 \(O(n^2)\) 的 Dijkstra 进行扩展即可。

时间复杂度 \(O(n^3)\)

Code

Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round)

原文:https://www.cnblogs.com/syksykCCC/p/Technocup-2021-Final-Round.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!