[CEOI2017]Building Bridges(李超树优化dp)
不难发现一个 \(O(n^2)\) 的 dp 式子:\(f_i=\min\{f_j+(h_i-h_j)^2+\sum_{k=j+1}^{i-1}w_i\}\)。
\(n^2\) 过十万不是碳基生物应该追求的事情,我们考虑优化。对于式子的后半部分,我们发现前缀和可以处理,于是设 \(s\) 为 \(w\) 的前缀和,有 \(f_i=\min\{f_j+(h_i-h_j)^2+w_{i-1}-w_j\}\)。
短时间内没有进一步发现,我们爆拆式子:
\[\begin{align}
&f_i=\min\{f_j+{h_i}^2-2\times h_i\times h_j+{h_j}^2+w_{i-1}-w_j\}&\nonumber
\\
&f_i=\min\{-2\times h_j\times h_i+f_j+{h_j}^2-w_j\}+{h_i}^2+w_{i-1}&\nonumber
\end{align}
\]
显然,\(\min\{...\}\) 中的部分形如一条直线,斜率为 \(-2\times h_j\),截距为 \(f_j+{h_j}^2-w_j\)。这只于 \(j\) 有关。我们完全可以把这 \(n\) 条直线扔进李超树里,实现 \(O(n\times \log_2^n \times \log_2^n)\) 的时间复杂度。
注意几个细节:
- 不开 long long 见祖宗;
- 应当把截距 \(b_0\) 赋值为 \(\inf\);
- 值域是 \([0,1000000]\),每次调用函数时都一样。
此题还有其他做法:CDQ 分治,斜率优化,二进制分组(\(\text{zrz}\) 的奇妙方法)。