题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=1010

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。

Output

输出最小费用

Sample Input

5 4
3
4
2
1
4

Sample Output

1

HINT

 
1<=N<=50000,1<=L,Ci<=10^7
 
 
 
 
 

题意概述:

  现在有N件物品,每件物品有一个长度Ci,现在要求把这些物品分组,每组必须是连续的一段,假如把第i~j件物品分成一组,那么这一组的长度x为j-i+sum{ck|i<=k<=j},同时这一组的代价为(x-L)^2,L是一个常量。现在问将这些物品分组的最小代价。1<=N<=50000,1<=L,Ci<=10^7.

分析:

  容易看出来一个dp模型。

  令f(i)表示将前i个物品分组的最小代价。

  f(i)=min{ f(j)+(i-j-1+sum[i]-sum[j]-L)^2 | 0<=j<i }

  令wi=i+sum[i],LL=L+1,去掉min,改写式子得到:

  [2*wj*LL+wj^2+f(j)]=wi*(2*wj)+f(i)-(wi-LL)^2

  如果把(2*wj,2*wj*LL+wj^2+f(j))看成点,那么现在要做的就是在一个点集中找到一个点使得f(i)-(wi-LL)^2最小。

  每次计算的直线的斜率有单调递增的趋势。因为是斜率始终大于0并且要让纵截距最小,于是我们需要维护一个下凸壳。因为斜率具有单调性,所以说每一次计算的时候都从队首取出一个元素计算,并且和队首后面的元素计算出来的答案比较。如果队首的答案更劣,那么直接出队,因为斜率具有单调性,之后一定也不会用到这个点了。每一次计算完之后插入新点,对于新点来说从队尾开始看起。如果这个点和队尾前一个点的斜率小于队尾和队尾前一个点的斜率,那么说明队尾的点被包住了,出队,最后把这个点甩进去(因为插入的点的横坐标都是单调递增的,所以说不会有一些奇奇怪怪的问题)。两个出队操作都在当前点不更加优秀或者队列中只有一个点的时候停止。

  时间复杂度O(N)。

  注意两个很sb的问题:1.初始化的时候要用0来初始化,表示这个物品和前面所有的物品分成一组;2.因为我们引用了斜率这个概念,所以在推式子的时候一定记得把式子写成斜截式!!!

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=;
typedef long long LL; int N,L,C[maxn];
LL f[maxn],sum[maxn];
struct XY{ LL x,y; }mq[maxn]; int front,rear; void data_in()
{
scanf("%d%d",&N,&L);
for(int i=;i<=N;i++) scanf("%d",&C[i]);
}
LL X(int i){ return *(i+sum[i]); }
LL Y(int i){ return *(i+sum[i])*(L+)+(i+sum[i])*(i+sum[i])+f[i]; }
double getk(const XY &a,const XY &b){ return 1.0*(a.y-b.y)/(a.x-b.x); }
void work()
{
for(int i=;i<=N;i++) sum[i]=sum[i-]+C[i];
mq[rear++]=(XY){X(),Y()};
XY p;
for(int i=;i<=N;i++){
while(rear-front>&&getk(mq[front],mq[front+])<i+sum[i]) front++;
f[i]=-(i+sum[i])*mq[front].x+mq[front].y+(i+sum[i]-L-)*(i+sum[i]-L-);
p=(XY){X(i),Y(i)};
while(rear-front>&&getk(p,mq[rear-])<getk(mq[rear-],mq[rear-])) rear--;
mq[rear++]=p;
}
cout<<f[N]<<'\n';
}
int main()
{
data_in();
work();
return ;
}

BZOJ 1010 HNOI2008 玩具装箱 斜率优化的更多相关文章

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

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 路由器基本配置实验,静态路由和动态RIP路由

    实验涉及命令以及知识补充 连线 PC和交换机FastEtherNet接口 交换机和路由器FastEtherNet接口 路由器和路由器Serial接口 serial是串行口,一般用于连接设备,不能连接电 ...

  2. c# Hash一致算法实现负载均衡

    开篇吹牛..... 不吹了,因为我不擅长算法,就不胡说八道了. 现在一般的实现负载均衡,主要采用2种方法: 1.轮训    2.负载均衡算法 轮训就不说了,负载均衡现在一般采用HASH一致算法 不多说 ...

  3. jquery 层级选择器

    关于层级选择器. $("parent > child") 选择所有指定“parent”元素中指定的“child”的直接子项元素. parent :任何有效的选择器. chil ...

  4. HTML5读取input[type=file]中的图片

    转载 https://blog.csdn.net/fd214333890/article/details/71250488

  5. ubuntu安装和常用软件推荐

    ubuntu安装和常用软件推荐(个人整理) 2016.08.22 17:29 13811浏览 字号 安装一套双系统,win10打游戏,ubuntu开发,win10放机械,ubuntu放固态,电脑联想i ...

  6. Java 使用Apache POI读取和写入Excel表格

    1,引入所用的包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxm ...

  7. PHP中有关IPV4 和IPV6地址转换以及其它一些常见问题

    这里主要介绍一下 IPV4 / IPV6 在 PHP / MySQL 中如何转换.以及中间容易碰到的一些问题. 首先介绍两个函数: ip2long:将 IPV4 的字符串互联网协议转换成长整型数字 i ...

  8. Phpstudy2018 集成环境配置虚拟域名访问到Index Of 下

    (1)    Phpstudy是一款php集成开发环境 可随意切换Php的版本以及服务器. Phpstudy的网站根目录默认为WWW目录,那么如果我们想通过虚拟域名访问到Index Of目录来便于查看 ...

  9. sorted() ,filter() ,map()的用法

    sorted() 排序函数. 语法: sorted(Iterable, key=None, reverse=False) Iterable: 可迭代对象 key: 排序规则(排序函数), 在sorte ...

  10. DedeCMS V5.7sp2最新版本parse_str函数SQL注入漏洞

    织梦dedecms,在整个互联网中许多企业网站,个人网站,优化网站都在使用dede作为整个网站的开发架构,dedecms采用php+mysql数据库的架构来承载整个网站的运行与用户的访问,首页以及栏目 ...