[luogu P3195] [HNOI2008]玩具装箱TOY

题目描述

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。但他希望费用最小.

输入输出格式

输入格式:

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

输出格式:

输出最小费用

输入输出样例

输入样例#1:

5 4

3

4

2

1

4

输出样例#1:

1

开启斜率优化DP的学习。(可能因为状态原因,学的比较慢)

不太会讲理论,就对这道题讲一讲吧。

首先,我们可以列出一个n^2的转移方程:

f[i]=min(f[j]+(i-j-1+(s[i]-s[j])-L)^2)(j<i)。

将这个式子变化一下:

f[i]=min(f[j]+((i+s[i]-L-1)-(j+s[j]))^2)

设a[i]=i+s[i]-L-1,b[i]=i+s[i]。(当然也可以用一个数组,这里为了方便分辨)

则f[i]=min(f[j]+(a[i]-b[j])^2)=min(f[j]+a[i]^2-2a[i]b[j]+b[j]^2)。

即f[i]=?f[j]+a[i]^2-2a[i]b[j]+b[j]^2。

假装这是成立的,则设y=f[j]+b[j]^2,k=2a[i],x=b[j],b=f[i]-a[i]^2,

得到y=kx+b。

显然,我们需要让f[i]尽可能的小,就需要使得f[i]=b+a[i]^2尽可能小,也就是使b尽可能的小。

由于b=y-kx,其中k是确定的,y和x对于每一个j<i都是确定的,我们就可以将(x,y)表示在二维平面上。

现在,假如我们固定住x坐标,则y坐标要尽可能的小。

如果固定y坐标,则要尽可能增大x=b[j],根据前面的定义,b[]是单调递增的。但是由于y也是单调递增的,所以问题变得复杂了些。

那怎么办?这就涉及到了问题的本质。

对于一类转移方程:

f[i]=min{a[i]*b[j]+c[i]+d[j]}(a[i]和c[i]是常数,b[j]和d[j]与f[j]相关,j<i)

可以使用斜率优化。

稍微转换一下,考虑两个转移j和k,假如j比k更优,有a[i]*b[j]+c[i]+d[j]<a[i]*b[k]+c[i]+d[k]。

为方便考虑,设bj<bk,则得到-a[i]<(d[k]-d[j])/(b[k]-b[j]),这后面的就可以看成两点间直线的斜率。

那这就提示了我们,我们可以在两点间的斜率上做点功夫。

对于这题,沿用上面的式子,得到2a[i]<k(u,v)时,u比v更优。k(u,v)=(yv-yu)/(xv-xu)

这样,我们相当于要维护一个斜率直升不降的单调队列,每次询问时找出满足k(head,head+1)>2a[i]的head,然后,将更新后的f[i]插入到单调队列的队尾。

这样,我们就能将时间复杂度降到O(N)了。(个人觉得有点凌乱,如果读者觉得有上面地方表达不妥或有误,望指出)

code:

 %:pragma GCC optimize()
 #include<bits/stdc++.h>
 #define sqr(x) ((x)*(x))
 #define LL long long
 using namespace std;
 ;
 const double inf=1e18;
 int n,L,l,r; LL f[N],c[N],a[N],b[N];
 struct point {
     LL x,y;
     point() {}
     point(LL _x,LL _y):x(_x),y(_y) {}
 }st[N];
 inline int read() {
     ; char ch=getchar();
     ') ch=getchar();
     +ch-',ch=getchar();
     return x;
 }
 double slope(point u,point v) {
     return u.x==v.x?(u.y<v.y?inf:-inf):1.0*(v.y-u.y)/(v.x-u.x);
 }
 LL get(LL k) {
     ])<1.0*k) l++;
     return st[l].y-k*st[l].x;
 }
 void insert(point cur) {
     ],st[r])>slope(st[r-],cur)) r--;
     st[++r]=cur;
 }
 int main() {
     n=read(),L=read(),c[]=;
     ; i<=n; i++) c[i]=c[i-]+read();
     ; i<=n; i++) a[i]=i+c[i]-L-;
     ; i<=n; i++) b[i]=i+c[i];
     memset(f,,sizeof f);
     l=,r=,st[++r]=point(,);
     ,j; i<=n; i++) {
         f[i]=*a[i])+sqr(a[i]);
         insert(point(b[i],f[i]+b[i]*b[i]));
     }
     printf("%lld\n",f[n]);
     ;
 }

[luogu P3195] [HNOI2008]玩具装箱TOY的更多相关文章

  1. P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)

    P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...

  2. P3195 [HNOI2008]玩具装箱TOY 斜率优化dp

    传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...

  3. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  4. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

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

  5. P3195 [HNOI2008]玩具装箱TOY

    列出DP方程式:设f[i]表示分组完前i件物品的最小花费,为方便计算,设sum[i]表示是前i件物品的长度和. f[i]=min(f[j]+(sum[i]-sum[j]+i-j-L-1)^2) [0& ...

  6. [洛谷P3195][HNOI2008]玩具装箱TOY

    题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...

  7. 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...

  8. 洛谷 P3195 [HNOI2008]玩具装箱TOY

    题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...

  9. Luogu P3195 [HNOI2008]玩具装箱

    题目 预处理\(C\)的前缀和\(sum\).设前\(i\)个物品的最小答案为\(f\). \(f_i=\max\limits_{j\in[1,i)}(f_j+(sum_i-sum_j-L)^2)\) ...

随机推荐

  1. 17秋 SDN课程 第一次作业

    SDN第一次作业 你会选择作 网络编程 方向的程序员吗?为什么? 有可能.原因如下: 1.我的研究与网络密切相关: 2.SDN侧重软件实现,自然涉及socket等网络编程知识,属于基本功: 3.市场. ...

  2. 程序修改图标后显示未更新——强制刷新windows图标缓存

    http://blog.csdn.net/vvlowkey/article/details/51133486 20160412 问题:修改兴迪局放测量软件图标后,release文件夹中生成文件的小图标 ...

  3. Aviutl 视频处理软件

    素材类:No.009 倒放(Video)         http://www.bilibili.com/video/av3078207/ No.010 倒放(Object)         http ...

  4. 用Let's Encrypt实现Https(Windows环境+Tomcat+Java)

    补充1: 已解决20的部分问题,移步这里 单域名下多子域名同时认证HTTPS 补充2: 之前忘了说了,我这个方法只对Tomcat7.0以上有用(要不然就是8.0...) 我自己用的是9.0 原因好像是 ...

  5. python 移动文件夹

    xxx@ddd:~$ mkdir testa testb >>> import shutil >>> shutil.move("/home/xxx/tes ...

  6. idea使用教程(2)

    目录: 1. open和import的区别 2.修改虚拟机配置信息 3.安装目录和设置目录 1. open和import的区别 open:如果本身就是idea项目,则可以直接open打开; impor ...

  7. js_计时器之setInterval

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. PostegreSQL模板数据库

    模板数据库 模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库设置和数据文件. CREATE DATABASE 实际上是通过拷贝一个现有的 ...

  9. Codeforces 934D - A Determined Cleanup

    934D - A Determined Cleanup 思路: 找规律,和k进制的求法差不多,答案的奇数位是p%k,偶数位如果p%k!=0,那么答案是k-p%k,否则为0. 代码: #include& ...

  10. winfrom 动态添加控件,以及删除

      private void btnadd_Click(object sender, EventArgs e)         {             int fileCount = 0;     ...