1010: [HNOI2008]玩具装箱toy

Time Limit: 1 Sec Memory Limit: 162 MB

Submit: 12665 Solved: 5540

[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


题解

本蒟蒻斜率优化第一题,真的玄学。
很容易我们就能得出转移方程:
dp[i]=min(dp[j]+(sum[i]+i-sum[j]-j-l-1)^2)(j < i)
但这样时间复杂度为O(n^2) n=50000会炸飞。
所以我们考虑斜率优化。
首先令A(i)=sum[i]+i。
B(i)=A(i)+l+1。
所以我们的转移方程可化简为:
dp[i]=dp[j]+(A(i)-B(j))^2;
所以dp[i]=dp[j]+A(i)^2-2*A(i)*B(i)+B(i)^2;
观察式子,A(i)^2只与i有关,所以先不做考虑。
再设X(i)=B(i),Y(i)=B(i)^2+dp[i];
继续化简得:
dp[i]=Y(j)-2*X(i)*A(i)+A(i)^2;
移项得
Y(j)=(dp[i]+2*X(i)*A(i)-A(i)^2;
发现上式形容y=kx+b。2*A(i)为斜率,而A(i)又是单调递增的,所以斜率单调递增,所以我们只需要维护
一个凸包,用单调队列。 首先先根据当前斜率判断队头是否合法,若不合法则弹出队头。
然后用队头更新dp[i]。
最后再让当前元素入队,维护凸包的性质,弹队尾。 时间复杂度O(n)。

代码

#include<bits/stdc++.h>
#define int long long using namespace std;
const int MAXN = 500005; int n,l;
int dp[MAXN],sum[MAXN];
int head=1,tail=1,q[MAXN]; inline double A(int i){return sum[i]+i;}
inline double B(int i){return A(i)+l+1;}
inline double Y(int i){return dp[i]+B(i)*B(i);}
inline double X(int i){return B(i);}
inline double sp(int i,int j){return 1.0*(Y(j)-Y(i))/(X(j)-X(i));} signed main() {
ios::sync_with_stdio(false);
cin>>n>>l;
for(register int i=1; i<=n; i++) {
int x;
cin>>x;
sum[i]=sum[i-1]+x;
}
for(register int i=1; i<=n; i++){
while(head<tail and 2*A(i)>sp(q[head],q[head+1])) head++;
dp[i]=dp[q[head]]+(A(i)-B(q[head]))*(A(i)-B(q[head]));
while(head<tail and sp(i,q[tail-1])<sp(q[tail-1],q[tail])) tail--;
q[++tail]=i;
}
cout<<dp[n]<<endl;
return 0;
}

BZOJ 1010 (HNOI 2008) 玩具装箱的更多相关文章

  1. [bzoj 1010][HNOI 2008]玩具装箱

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

  2. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

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

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

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

    2017.6.9:经过我的不懈努力,终于把此题A掉了,但上凸和下凸总是那么让人费解…… P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意 ...

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

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

  6. [HNOI 2008]玩具装箱

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

  7. 解题:HNOI 2008 玩具装箱

    题面 搞了一晚上斜率优化,大概懂了一点,写写 原来常用的优化dp方法:做前缀和,预处理,数据结构维护 现在有转移方程长这样的一类dp:$dp[i]=min(dp[i],k[i]*x[j]+y[j]+c ...

  8. [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...

  9. BZOJ 1009 HNOI 2008 GT考试 递推+矩乘

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3679  Solved: 2254[Submit][Statu ...

  10. [bzoj 1005][HNOI 2008]明明的烦恼(prufer数列+排列组合)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 分析: 首先prufer数列:http://baike.baidu.com/view/1 ...

随机推荐

  1. js中的数据类型隐式转换的三种情况

    js的数据类型隐式转换主要分为三种情况: 1. 转换为boolean类型 2. 转换为number类型 3. 转换为string类型 转换为boolean类型 数据在 逻辑判断 和 逻辑运算 之中会隐 ...

  2. scip 练习2.20

    (define (same-parity x . z) (define (q? y) (= (remainder y ) )) (define (o? y) (= (remainder y ) )) ...

  3. Q:微信小程序一次性订阅消息(前台收集)

    说明:官方文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.ht ...

  4. NOI2019赛前两周被吊打记录

    7.1 T1看了半天发现会个暴力FWT,然后突然返发现随便容斥一下就好了 T2猜了个只有13和23的,结果打个表发现伪了,然后标号不只一种连搜索都写错了,也没想过可以轮廓线dp,菜哭了o(╥﹏╥)o ...

  5. 大数据学习路线,来qun里分享干货,

    一.Linux lucene: 全文检索引擎的架构 solr: 基于lucene的全文搜索服务器,实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面. 推荐一个大数据学习群 ...

  6. 绘制delphi窗体的标题栏

    绘制delphi窗体的标题栏 按照设计,Delphi窗体的“标题”属性是由Windows负责绘制,标题栏在系统菜单旁边.如果你不想改变窗体的标题属性又想在窗体的标题栏添加一些自己的内容,你需要处理一个 ...

  7. Core Text 入门

    本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...

  8. class3_Entry & Text 输入和文本框

    程序总体运行效果图如下;   #!/usr/bin/env python # -*- coding:utf-8 -*- # -------------------------------------- ...

  9. Unity NGUI 粒子的排序

    Unity NGUI系统中是没有对粒子进行排序的,如: 怎么解决这个问题呢? 思路是把粒子的渲染层级,相对于UI组件的层级进行一个偏移. 解决后的效果如下: 代码如下: using System.Co ...

  10. ADIS16405BMLZ

    GND,VCC,CS,DOUT,SCLK,DIN