P4655[CEO2017]Building Bridges
Building Bridges
\(CDQ\)分治
对, 这道题我的第一反应就是斜率优化
先推一波式子:
\[ \text{先令Dp[i]表示以i结尾的这一段的贡献, S[i]表示关于W[i]的一个前缀和}\\ \begin{align*} Dp[i] &= (h[i]-h[t])^2+S[i-1]-S[t]\\ Dp[j] &= (h[j]-h[t])^2+S[j-1]-S[t]\\ \end{align*}\\ \]
若\(Dp[j]>Dp[i]\), 那么有: \[ \begin{align*} (h[j]-h[t]^2)+S[j-1]-S[t]&>(h[i]-h[t]^2)+S[i-1]-S[t]\\ h[j]^2-2h[j]h[t]+h[t]^2+S[j-1]-S[t]&>h[i]^2-2h[i]h[t]+h[t]^2+S[i-1]-S[t]\\ h[j]^2-2h[j]h[t]+S[j-1]&>h[i]^2-2h[i]h[t]+S[i-1]\\ (h[j]+S[j-1])-(h[i]-S[i-1])&>2h[t]*(h[j]-h[i])\\ \frac{g[j]-g[i]}{h[j]-h[i]}&>2h[t] \end{align*} \] 那么这个式子要想写斜率优化的话,\(h\)数组要保证单调
嗯,就分治,排序,然后斜率\(Dp\)
时间复杂度
\(O(\log^2n)\)应该没有问题吧,没有写代码,口胡
李超线段树
???,怎么回事,看错题了?
没有,个人认为这才是正解!!!
再来看看我们的式子: \[ \begin{align*} Dp[i]&=(h[i]-h[t])^2+S[i-1]-S[t]+Dp[t]\\ &=h[i]^2-2h[i]h[t]+h[t]^2+S[i-1]-S[t]+Dp[t]\\ &=h[i]^2+S[i-1]+\min_{t=1}^{i-1}(h[t]^2-2h[t]h[i]-S[t]+Dp[t]) \end{align*} \] 看见其实对于我们的\(i\),它的答案其实有一部分是定值,还有一部分与之前的信息相关联
那么我们可以新定义一个函数叫\(f_t(x)\): \[ f_t(x)=-2h[t]\times x+h[t]^2-S[t]+Dp[t] \] 那么,原式可以化为 \[ Dp[i]=h[i]+S[i-1]+\min_{t=1}^{i-1}f_t(H[i]) \]
相当于是向一个坐标系中加入了很多条线段,问你在某个点时的最小值,是吧
此时,\(f_t(x)\)的斜率为\(-2h[t]\),截距为\(h[t]^2-S[t]+Dp[t]\)
就可以了
Code
1 |
|