BZOJ 1010 (HNOI 2008) 玩具装箱
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) 玩具装箱的更多相关文章
- [bzoj 1010][HNOI 2008]玩具装箱
传送门 Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号 ...
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9330 Solved: 3739 Descriptio ...
- BZOJ 1010: [HNOI2008]玩具装箱toy(DP+斜率优化)
[HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- BZOJ 1010 [HNOI2008]toy 玩具装箱
2017.6.9:经过我的不懈努力,终于把此题A掉了,但上凸和下凸总是那么让人费解…… P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意 ...
- 【BZOJ 1010】 [HNOI2008]玩具装箱toy
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- [HNOI 2008]玩具装箱
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- 解题:HNOI 2008 玩具装箱
题面 搞了一晚上斜率优化,大概懂了一点,写写 原来常用的优化dp方法:做前缀和,预处理,数据结构维护 现在有转移方程长这样的一类dp:$dp[i]=min(dp[i],k[i]*x[j]+y[j]+c ...
- [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
- BZOJ 1009 HNOI 2008 GT考试 递推+矩乘
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3679 Solved: 2254[Submit][Statu ...
- [bzoj 1005][HNOI 2008]明明的烦恼(prufer数列+排列组合)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 分析: 首先prufer数列:http://baike.baidu.com/view/1 ...
随机推荐
- Linux 网络 tcp C/S通信模型
C/S模型就是server 与 client 的模型 TCP服务器模型流程图 ...
- 从零开始搭建系统2.2——ELK安装及配置
ELK 最新版本对JDK的最低要求是1.8,安装java_1.8版本 一.Elasticsearch 1.创建目录 2.下载安装包 wget https://artifacts.elastic.co/ ...
- [LOJ#2732] 「JOISC 2016 Day 2」雇佣计划
参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案 ...
- zmq的send
int zmq_send (void *socket, zmq_msg_t *msg, int flags); 2.2.1 nt zmq_send (void *socket, void * ...
- openwrt redis
2071 make V=s 2072 cd build_dir/target-x86_64_uClibc-0.9.33.2/root-x86/ cd package/network/services/ ...
- 过滤掉map集合中key或value为空的值
package cn.com.utils; import org.apache.commons.lang3.StringUtils; import java.util.Collection; impo ...
- C# using System.Windows.Media.Imaging;该引用哪个dll
在网上看到BitmapSource和WriteableBitmap一些类听说是用 using System.Windows.Media.Imaging:可是我发现VS中没有什么System.Windo ...
- 暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D
涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值 /* 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有 ...
- Delphi实现屏幕截图、窗口截图、指定区域截图
Use Jpeg procedure TForm1.snapscreen(a,b,c,d:Integer); var bmpscreen:Tbitmap; jpegscreen:Tjpegimage; ...
- OpenStack与KVM的区别与联系
转:https://www.aliyun.com/zixun/content/2_6_280418.html OpenStack与KVM都是目前IT界比较热门的两个词汇.它们都是开源的,都与Linux ...