1010: [HNOI2008]玩具装箱toy

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 7184  Solved: 2724
[Submit][Status][Discuss]

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

HINT

 

Source

题解:laishao_yuan:Dp先入脑

有一个Dp[i]:=min(Dp[j]+(sum[i]-sum[j]+i-j-1-L)^2)的基本思路
预处理可以得到F[i]:=sum[i]+i;令C=L+1
可以简化方程:Dp[i]:=min(Dp[j]+(F[i]-F[j]-c)^2))
明显这个为O(N^2)的算法,,要再简化;
一维的Dp可以想到斜率优化
 
所谓斜率优化,个人的感悟就是:
当 I:1-->n J:1-->n的N^2循环时 可以简化J的循环 把1~N依次入队出队,当i要选择j时,先根据最优策略缩短队列,再在选取队首元素直接作为J,算出Dp[i];
这样做的话每个数进出一次队列 复杂度就变为O(n);
 
但是这样做必须证明单调性,也就是出队的元素在以后的Dp中不会再被利用
 
下面说说怎么缩短队列
Dp[i]:=min(Dp[j]+(F[i]-F[j]-c)^2))中j的选择是决定Dp[i]的大小的 而 f[i]、c这样的常量是不变的(对于同一个i来说)
所以我们把不含j的变量分离出来,方便运算
Dp[i]:=min(Dp[j]+F[j]^2-2F[i]F[j]+2F[j]*c)+F[i]^2+c^2-2*F[i]*c;
假设选j好过选k, 本题为
Dp[j]+F[j]^2-2F[i]F[j]+2F[j]*c<Dp[k]+F[k]^2-2F[i]F[k]+2F[k]*c化简分离i
 
Dp[j]-Dp[k]+(F[i]-F[k])*(2c+F[j]+F[k])
-------------------------------------------<F[i](*)
                   2(F[j]-F[k])
 
简化其为COM(j,k)<F[i]
也就是说 ‘选j好过选k’当且仅当‘COM(j,k)<F[i]成立’
所以如果一个队列的头依次为A,B 如果G(B,A)<=F[i] 那么把A删了吧
代码们:
 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=;typedef long long LL;
int deq[maxn];LL C[maxn],S[maxn],dp[maxn];
double slope(int i,int j){return (dp[i]+S[i]*S[i]-dp[j]-S[j]*S[j])/(double)(S[i]-S[j]);}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*sig;
}
inline LL readl(){
LL x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*sig;
}
inline void write(LL x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=;LL buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n,L;
void init(){
n=read();L=read();C[]=S[]=;
for(int i=;i<=n;i++){C[i]=readl();C[i]+=C[i-];S[i]=i+C[i];}
return;
}
void work(){
int s=,e=;dp[]=deq[s]=;
for(int i=;i<=n;i++){
LL m=S[i]-L-;
while(s<e&&slope(deq[s+],deq[s])<=(m<<))++s;
int j=deq[s];dp[i]=dp[j]+(m-S[j])*(m-S[j]);
while(s<e&&slope(deq[e],deq[~-e])>=slope(i,deq[e]))--e;
deq[++e]=i;
}
return;
}
void print(){
write(dp[n]);
return;
}
int main(){init();work();print();return ;}

BZOJ 1010 [HNOI2008]玩具装箱toy的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 1010: [HNOI2008]玩具装箱toy | 单调队列优化DP

    原题: http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题解: #include<cstdio> #include<algo ...

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

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

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

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

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

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

随机推荐

  1. [PWA] 8.Unobtrusive update: Delete old cache and only keep one, hard refresh to let new SW to take control

    So once you modify the code, service worker will auto create a new one and it won't take control ove ...

  2. 关于Xcode的Other Linker Flags

    背景 在ios开发过程中,有时候会用到第三方的静态库(.a文件),然后导入后发现编译正常但运行时会出现selector not recognized的错误,从而导致app闪退.接着仔细阅读库文件的说明 ...

  3. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  4. POJ 3449 Geometric Shapes (求正方形的另外两点)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1470   Accepted: 622 D ...

  5. 10、SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  6. Effective java-泛型思维导图

  7. My.Ioc 代码示例——注册项的注销和更新

    当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢? 有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”.对于这个问题,有人的回答是“有趣.你为什么 ...

  8. Html5 Canvas Text

    html5 canvas中支持对text文本进行渲染;直接的理解就是把text绘制在画布上,并像图形一样处理它(可以加shadow.gradient.pattern.color fill等等):既然它 ...

  9. WebSocket协议

    websocket 简介 (2013-04-09 15:39:28) 转载▼   分类: websocket 一 WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例 ...

  10. 【转】iOS6中的Auto Layout:通过代码添加约束

        最近做的项目用到了Auto Layout,于是经过了一番大量的google,这是我看到的讲用代码创建约束最清晰的一篇教程,于是想跟更多的人分享一下.原文也比较简单,可以直接过去看,如果我翻译的 ...