Description

  P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压
缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过
压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容
器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一
个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,
如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容
器,甚至超过L。但他希望费用最小.

Input

  第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

Output

  输出最小费用

Sample Input

5 4
3
4
2
1
4

Sample Output

1
 

题解

这道题朴素dp要O(n^2),果断超时,dp[i]表示前1~i合并的最优值,枚举j表示前一次合并的位置

那么dp[i]=min(dp[i],dp[j]+(i-(j+1)+s[i]-s[j]-L)^2)

这里可以用斜率优化来做,把复杂度降到O(n)

我们假设k<j<i,j比k更优,那么就是dp[j]+(i-(j+1)+s[i]-s[j]-L)^2<=dp[k]+(i-(k+1)+s[i]-s[k]-L)^2

我们这里再用f[i]=s[i]+i,那么式子化成了dp[j]+(f[i]-f[j]-1-L)^2<=dp[k]+(f[i]-f[k]-1-L)^2

再接着化下去就变成了

(dp[j]-dp[k]+(f[j]+1+L)^2-(f[k]+1+L)^2)/(2*(f[j]-f[k]))<=f[i]

根据这个式子,我们在加入队列的时候就可以判断了

对于踢出队尾,我们考虑一下q[tail],i和q[tail-1],q[tail]的斜率

因为f[i]是单调递增的,q[tail-1],q[tail]原来就满足<=f[i],所以要踢出队尾,就要有q[tail],i<q[tail-1],q[tail](表示i比q[tail]更优)

 #include<bits/stdc++.h>
#define N 50005
#define ll long long
using namespace std;
int n,head,tail;
ll L;
int a[N];
ll s[N],f[N],dp[N],q[N];
double calc(int k,int j){
return (double)(dp[j]-dp[k]+(f[j]++L)*(f[j]++L)-(f[k]++L)*(f[k]++L))/(*(f[j]-f[k]));
}
int main(){
scanf("%d%lld",&n,&L);
for (int i=;i<=n;i++)
scanf("%lld",&a[i]),f[i]=f[i-]++a[i];
head=; tail=;
for (int i=;i<=n;i++){
while (head<tail&&calc(q[head],q[head+])<=f[i]) head++;
int k=q[head];
dp[i]=dp[k]+(f[i]-f[k]--L)*(f[i]-f[k]--L);
while (head<tail&&calc(q[tail],i)<calc(q[tail-],q[tail])) tail--;
q[++tail]=i;
}
printf("%lld\n",dp[n]);
return ;
}

BZOJ-1010-[HNOI2008]玩具装箱toy(斜率优化)的更多相关文章

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

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

  2. Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定 ...

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

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  4. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][St ...

  5. BZOJ 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][St ...

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

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

  7. BZOJ 1010: [HNOI2008]玩具装箱toy(斜率优化dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 有n条线段,长度分别为C[i]. 你需要将所有的线段分成若干组,每组中线段的 ...

  9. BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)

    题目链接 斜率优化 不说了 网上很多 这的比较详细->Click Here or Here //1700kb 60ms #include<cstdio> #include<cc ...

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

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

随机推荐

  1. JS函数参数

    1.js不是面向对象,不可以重载函数.如果两个函数方法名相同,参数不同,那么js加载时后面的函数会覆盖前面的函数. 所以调用函数时只会调用后面的方法. 2.js设置可变参数时,可以用arguments ...

  2. Ext.Ajax.request

    function create(){ var itstate = $("#myselect").val(); Ext.Ajax.request({ url: '/servlet/A ...

  3. app端性能测试笔记

     IOS不清楚,我就说说android平台吧 1.按不同维度  APP级性能.代码级性能      app这一级   GT啊  emmage都可以检测 2.代码级性能的话  有可以分几块 函数性能UI ...

  4. github+hexo搭建自己的博客网站(四)主题之外的一些基本配置(统计配置,网站访问量显示)

    1.百度.谷歌统计配置 百度统计配置 申请账号:https://tongji.baidu.com/web/welcome/login 在代码获取的地方只要填入key即可 注册的时候,填的域名和url, ...

  5. 建立maven工程pom.xml报错:web.xml is missing and <failOnMissingWebXml> is set to true

    解决方式:如图添加web.xml文件即可

  6. 从web图片裁剪出发:了解H5中的canvas

    本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...

  7. python tornado 实现类禅道系统

    最近楼主加班 喽, 好久没有更新我的博客了,哎,一言难尽,废话我就不说了,来开始上精华. 背景:目前市面上有很多bug管理工具,但是各有各的特点,最著名,最流行的就是禅道,一个偶然的机会接触到了pyt ...

  8. 个人作业2——必应词典APP分析

    第一部分:调研.评测 1.刚刚打开必应词典的时候,它给我的第一反应就是界面美观,最上面是一个查询框,下面有一些经典的句子.单词以及一些精选的文章,所有的功能都可以一目了然,看一眼就知道要怎么去使用,这 ...

  9. Java学习5——标识符和关键字

    标识符: 1.Java对各种变量.方法和类等要素命名时使用的字符串序列称为标识符.凡是自己可以起名字的地方都叫标识符,都要遵守标识符的规则. 2.Java标识符命名规则: 标识符由字母.下划线&quo ...

  10. 201521123016《Java设计与程序》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...