[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}\) 的奇妙方法)。

THE END

posted @ 2021-09-05 23:40  q0000000  阅读(41)  评论(0编辑  收藏  举报