传送门

一道经典的斜率优化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. foreach 使用&引用赋值要注意的问题

    <?php $arr = array('a', 'b', 'c'); $arr2 = array('d', 'e', 'f'); foreach($arr as &$value){ $v ...

  2. Eclipse 更改Maven项目名

    1. 在Eclipse 中修改项目名 没错这种方法跟你预料的一样简单,当项目已经导入到 Eclipse 之后,只需要做两个事情 1.1 改项目文件夹名称 选中项目,按 F12 ,改名. 多数人改项目名 ...

  3. ubuntu 安装MySQLdb

    ubuntu运行sudo pip install MySQL-python安装MySQLdb时报错:Command "python setup.py egg_info" faile ...

  4. ansible之条件语句when

    注册变量: 变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用.例如: - hosts: webservers tasks: - shell: /usr/bin/foo ...

  5. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  6. 条件语句;for循环 嵌套复习

    //打印数字,0,1,8,10,12,每一个数单独占一行 //在全部数字打印完毕之后在打印数字的个数和所有数的和 int count = 0; int sum = 0; for (int i = 0; ...

  7. 序列下载及处理之seqinr包

    缺点:需要联网,经常出错,不是操作问题而是因为网络问题 安装 if("seqinr" %in% rownames(installed.packages()) == FALSE) { ...

  8. spring 在web容器启动时执行初始化方法

    开发框架:spingMVC+myBatis 解决方案:给web容器添加一个Listener类,在容器启动的时候执行Listener的“初始化”方法,在这个初始化方法中执行查询数据库的所有操作,然后将数 ...

  9. Python property() 函数

    Python property() 函数  Python 内置函数 描述 property() 函数的作用是在新式类中返回属性值. 语法 以下是 property() 方法的语法: class pro ...

  10. TZOJ 1545 Hurdles of 110m(01背包dp)

    描述 In the year 2008, the 29th Olympic Games will be held in Beijing. This will signify the prosperit ...