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
我好菜啊。——ฅ(OωO)ฅ