题目链接: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\) 处架桥的最小花费,容易发现:
我们令 \(s_i=\sum_{j=1}^i w_j\),则有:
是不是很想斜率优化?令 \(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