传送门

一道经典的斜率优化dp。

推式子ing。。。

令f[i]表示装前i个玩具的最优代价。

然后用老套路。

我们只考虑把第j+1" role="presentation" style="position: relative;">j+1j+1~i" role="presentation" style="position: relative;">ii个玩具分成一组的情况,之前的1~j个自行按最优情况分组。

显然有f[i]=f[j]+(sum[i]−sum[j]+L)2" role="presentation" style="position: relative;">f[i]=f[j]+(sum[i]−sum[j]+L)2f[i]=f[j]+(sum[i]−sum[j]+L)2

那么对于决策j,k。

谁对i的贡献更优呢?

我们假设j更优。

显然有

f[i]=f[j]+(sum[i]−sum[j]+L)2&lt;f[i]=f[k]+(sum[i]−sum[k]+L)2" role="presentation" style="position: relative;">f[i]=f[j]+(sum[i]−sum[j]+L)2<f[i]=f[k]+(sum[i]−sum[k]+L)2f[i]=f[j]+(sum[i]−sum[j]+L)2<f[i]=f[k]+(sum[i]−sum[k]+L)2

=>f[j]+sum[j]2−2sum[i]∗sum[j]&lt;f[k]+sum[k]2−2sum[i]∗sum[k]" role="presentation" style="position: relative;">f[j]+sum[j]2−2sum[i]∗sum[j]<f[k]+sum[k]2−2sum[i]∗sum[k]f[j]+sum[j]2−2sum[i]∗sum[j]<f[k]+sum[k]2−2sum[i]∗sum[k]

设T[t]=f[t]+sum[t]2" role="presentation" style="position: relative;">T[t]=f[t]+sum[t]2T[t]=f[t]+sum[t]2

=>(T[j]−T[k])/(sum[j]−sum[k])&lt;2sum[i]" role="presentation" style="position: relative;">(T[j]−T[k])/(sum[j]−sum[k])<2sum[i](T[j]−T[k])/(sum[j]−sum[k])<2sum[i]

这不就是斜率优化么?

用队列维护一下就行了。

继续分析会发现应该维护单调递增的斜率,也就是维护一个下凸壳。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 50005
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,hd,tl,q[N];
ll L,sum[N],f[N];
inline ll gety(int i,int j){return f[i]-f[j]+sum[i]*sum[i]-sum[j]*sum[j];}
inline ll getx(int i,int j){return sum[i]-sum[j];}
inline double slope(int i,int j){return 1.0*gety(i,j)/getx(i,j);}
int main(){
    n=read(),L=read()+1,hd=tl=1;
    for(int i=1;i<=n;++i)sum[i]=sum[i-1]+read();
    for(int i=1;i<=n;++i){
        sum[i]+=i;
        while(hd<tl&&slope(q[hd+1],q[hd])<=2*(sum[i]-L))++hd;
        f[i]=f[q[hd]]+(sum[i]-L-sum[q[hd]])*(sum[i]-L-sum[q[hd]]);
        while(hd<tl&&slope(q[tl],q[tl-1])>slope(i,q[tl]))--tl;
        q[++tl]=i;
    }
    cout<<f[n];
    return 0;
}

2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)的更多相关文章

  1. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  2. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  3. 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  4. [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp

    玩具装箱toy bzoj-1010 HNOI-2008 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...

  5. [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  6. P3195 [HNOI2008]玩具装箱TOY 斜率优化dp

    传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...

  7. [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  8. bzoj1010: [HNOI2008]玩具装箱toy——斜率优化

    方程 $\Large f(i)=min(f(j)+(s(i)-s(j)-1-L)^2)$ 其中$s(i)$为i的前缀和再加上$i$ 对于某个$i$若$j$比$k$优,则 $\large f(j)+(s ...

  9. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

随机推荐

  1. el 表达式的比较和包含

    相等( equal ) :eq 不相等( not equal ): ne / neq 大于( greater than ): gt 小于( less than ): lt 大于等于( great th ...

  2. Spring MVC 异常处理 - ResponseStatusExceptionResolver

    作用在类和方法上面 更改返回的代码和错误消息 类上 通过throw new UserName***Exception()抛出 @ResponseStatus(value=HttpStatus.FORB ...

  3. 前端开发-2-HTML

    1.开发环境 市面上有很多的HTML编辑器可以选择,常见的Hbuild.Sublime Text.Dreamweare都可以用来开发HTML. 当然PyCharm也支持HTML开发. 2.文件后缀名规 ...

  4. eclipse从svn导入maven项目变成普通项目解决办法

    右击项目-->configure-->Convert to Maven Project

  5. python 在内存中处理tar.bz2文件

    如果tar.bz2文件是通过网络进行下载,那么可以直接在内存进行解压后读取文件内容,不用将文件缓存到本地然后解压再进行读取,可以节省IO. 处理经过gzip压缩的tar文件的方法见:https://s ...

  6. [转]谈谈前端渲染 VS 后端渲染

    首先,预编译跟前后端没有关系,预编译一样可以用于后端渲染. 看看下面的测试时间,单位: ms 模板字符串: var s = '{{#datas}}{{name}} abcdefg {{type}} { ...

  7. Mysql 5.8安装报错

    1 mysql安装过程中报下面这个错 解决方法:只要将目录改成反斜杠即可. 2 修改密码错误:ERROR 1064 (42000): You have an error in your SQL syn ...

  8. ant使用备忘

    ant是一个脚本构建工具,可能就是持续集成里面所需要的构建工具. 如果使用eclipse,里面会自带有ant工具,不需要再安装了,创建一个build.xml(或者其他的名字都可以),使用ant来运行就 ...

  9. 真验货客户尾缀sql

    '; --select * from TB_ADDBOMWG_LOG; --SELECT * FROM TB_MAN_ROUTING_QM; SELECT * FROM IN_ITEM WHERE I ...

  10. js:二级联动示例

    联动原理 当用户点击省级的下拉选项,选择所在省,下一个下拉选项里的选项,则变成用户选择省下的所有市的信息,不会出现其它省市的信息. 省市数据 把省市数据,保存在js文件中,以json形式保存,以便读取 ...