LuoguP4655 [CEOI2017]Building Bridges 解题报告

题目链接:https://www.luogu.com.cn/problem/P4655


我真傻,真的。我居然以为这道题是斜率优化。


题意简述:你现在有 \(n\) 个柱子,对于每个柱子 \(i\) 都有 \(h_i\)\(w_i\) 两个属性。在两个柱子 \(i,j\) 之间架桥需要 \((h_i-h_j)^2\) 的花费。对于剩下的不架桥的柱子,都要拆掉,每个被拆掉的柱子 \(i\) 都要花 \(w_i\)。求将 \(1\)\(n\) 连起来的最小花费。\(2 \le n \le 10^5 , 0 \le h_i,|w_i| \le 10^6\)


这个柿子比较傻,特别好推。

我们设 \(f_i\) 为在 \(i\) 处架桥的最小花费,容易发现:

\[f_i=\min_{1\le j < i} \{ f_j+\sum_{k=j+1}^{i-1}w_k + (h_i-h_j)^2\} \]

我们令 \(s_i=\sum_{j=1}^i w_j\),则有:

\[\begin{aligned}f_i &=\min_{1\le j < i} \{ f_j+s_{i-1}-s_j+ (h_i-h_j)^2\} \\&= \min_{1\le j < i} \{ f_j+s_{i-1}-s_j+ h_i^2+h_j^2-2h_ih_j\} \\&= s_{i-1}+h_i^2+\min_{1\le j < i} \{ f_j-s_j+ h_j^2-2h_ih_j\}\end{aligned} \]

是不是很想斜率优化?令 \(h_j\) 为横坐标,\(f_j-s_j+h_j^2\) 为纵坐标,维护凸包,不就没了?

很遗憾,\(h\) 不有序,你无法线性维护凸包。

然后怎么办?

第一种:使用 \(\mathrm{cdq}\) 分治。

但是我讨厌离线,于是我们选择李超线段树!!!

我们在李超线段树中插入一堆 \(y=-2h_jx+f_j-s_j+h_j^2\) 的直线,然后维护单点在何处最小。时间复杂度 \(O(n \log n)\)

代码待会再补 /youl

posted @ 2021-10-22 10:35  ฅ(OωO)ฅ  阅读(31)  评论(0编辑  收藏  举报
"scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") } -->