传送门

一道经典的斜率优化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. Eclipse安装STS(Spring Tool Suite (STS) for Eclipse)插件

    转自:https://blog.csdn.net/zhen_6137/article/details/79383941

  2. reportng代替testng的默认报告——pom设置

    既然是maven项目,直接关注pom设置. 这篇写得很清楚了:maven+testng+reportng的pom设置 强调一点的是,guice必须依赖,就因这个卡了大半天. <dependenc ...

  3. java ee7 软件安装和环境配置

    1. java ee sdk 最新版下载地址 Java EE软件开发包(Software Development Kit, SDK) http://www.oracle.com/technetwork ...

  4. Winform-图片上传

    1.界面上拖个.pictureBox(pictureBox1) //上传点击按钮 private void button1_Click(object sender, EventArgs e) { Op ...

  5. webpack项目在开发环境中使用静态css文件

    webpack项目在开发环境中使用静态css文件 在webpack项目(本人使用的 vue-cli-webpack )中,需要引入 css 或 scss等样式文件时,本人目前知道的,通常有以下几种方法 ...

  6. 跨越数据库操作时注意要加dbo

    跨越数据库操作时注意要加dbo insert into hrdb.dbo.TB_B_PROJECTS  :这样是正确的 insert into hrdb.TB_B_PROJECTS  :这样是错误的

  7. Boost.Coroutine2:学习使用Coroutine(协程)

    function(函数)routine(例程)coroutine (协程) 函数,例程以及协程都是指一系列的操作的集合. 函数(有返回值)以及例程(没有返回值)也被称作subroutine(子例程), ...

  8. Elon Musk

    人物事件 成长学习 年6月28日,埃隆·马斯克在南非的比勒陀利亚出生,他的 埃隆·马斯克 父亲是一名南非机电工程师,母亲是加拿大人,从事营养师兼模特.[8]  年,10岁的马斯克就拥有了自己的第一台电 ...

  9. JS中数组的创建方法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 部分真验货客户未取进FP IN_SALES_ORDER表有数据,前台规划页面没显示

    描述:部分真验货客户未取进FP,检查发现IN_SALES_ORDER表有数据630\600\610行项目数据,但前台只显示630数据,600和610前台没有显示 1.查看IN_SALES_ORDER表 ...