zoukankan      html  css  js  c++  java
  • P4655 [CEOI2017]Building Bridges

    (f_i) 为将第 (1) 根和第 (i) 根柱子相连的代价,则有状态转移方程:​

    [f_i=min{f_j+sumlimits_{k=j+1}^{i-1}w_k+(h_i-h_j)^2} ]

    我们可以令 (sum_i=sumlimits_{k=1}^iw_k) ,这样就可以将 (sumlimits_{k=j+1}^{i-1}w_k) 写作 (sum_{i-1}-sum_j) ,得:

    [f_i=min{f_j+sum_{i-1}-sum_j+(h_i-h_j)^2} ]

    展开 ((h_i-h_j)^2) 得:

    [f_i=min{f_j+sum_{i-1}-sum_j+h_i^2-2h_ih_j+h_j^2} ]

    整理可得:

    [f_i=min{(-2h_ih_j+f_j-sum_j+h_j^2)+(sum_{i-1}+h_i^2)} ]

    看上去是不是很像斜率优化DP的样子

    虽然是李超线段树板子题,不过我们用斜率优化做

    观察一下可以发现,若 (i) 确定,((sum_{i-1}+h_i^2)) 为常数项,可以忽略。

    于是就变成了对于一个确定的 (i),求 (min{-2h_ih_j+f_j-sum_j+h_j^2})

    若决策 (j) 优于决策 (k)

    [-2h_ih_j+f_j-sum_j+h_j^2<-2h_ih_k+f_k-sum_k+h_k^2 ]

    化简得

    [(f_j-sum_j+h_j^2)-(f_k-sum_k+h_k^2)<2h_i(h_j-h_k) ]

    [dfrac{(f_j-sum_j+h_j^2)-(f_k-sum_k+h_k^2)}{2(h_j-h_k)}<h_i ]

    (Y(i)=f_i-sum_i+h_i^2,X(i)=2h_i) ,则

    [dfrac{Y(j)-Y(k)}{X(j)-X(k)}<h_i ]

    因为 (h_i) 并不是单调的,所以需要CDQ分治来维护

    用splay维护动态凸包也不拦你(因为我不会)

    我们考虑将一个单调队列分为左右两个,然后递归处理,发现递归到长度为1时,可以像普通斜率优化一样建点。

    回溯时,因为左边对右边会有影响,所以先将左边的状态插入单调队列,再更新右边的状态。

    时间复杂度:(O(nlog^2n))

  • 相关阅读:
    oracle 语句 笔记
    10:基于Tomcat部署Web工程
    8.为什么IntelliJ IDEA首次加载比较慢
    04 全局配置,java 编意默认版本,1.6.修改配置
    02 IDEA创创建第一个maven工程
    01 安装IDEA
    spring security权限架架mvn坐标
    RBAC基于角色的权限访问控制
    MyBatis 中的#和$的区别
    python数据相关性分析 (计算相关系数)
  • 原文地址:https://www.cnblogs.com/jasony/p/13584331.html
Copyright © 2011-2022 走看看