bzoj1010HNOI2008玩具装箱 toy
Posted AaronPolaris
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1010HNOI2008玩具装箱 toy相关的知识,希望对你有一定的参考价值。
1010: [HNOI2008]玩具装箱toy
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8678 Solved: 3456
[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
3
4
2
1
4
Sample Output
1
斜率优化DP
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long #define maxn 50005 using namespace std; int n,L,l,r,q[maxn]; ll s[maxn],f[maxn],g[maxn],h[maxn]; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline double getk(int x,int y) { return (double)(f[x-1]+g[x]*g[x]-f[y-1]-g[y]*g[y])/(double)(g[x]-g[y]); } int main() { n=read();L=read(); F(i,1,n) s[i]=s[i-1]+read(); F(i,1,n) g[i]=s[i-1]+i,h[i]=s[i]+i-L; l=1;r=0; F(i,1,n) { while (l<r&&getk(q[r-1],q[r])>getk(q[r],i)) r--; q[++r]=i; while (l<r&&getk(q[l],q[l+1])<h[i]*2) l++; f[i]=f[q[l]-1]+g[q[l]]*g[q[l]]-h[i]*g[q[l]]*2+h[i]*h[i]; } printf("%lld\n",f[n]); return 0; }
以上是关于bzoj1010HNOI2008玩具装箱 toy的主要内容,如果未能解决你的问题,请参考以下文章