描述


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

给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\),要求将玩具分成若干段,从\(i\)到\(j\)分为一段的长度为\(x=j-i+\sum_{k=i}^jc[k]\),费用为\((x-l)^2\).求最小费用.

分析


用\(dp[i]\)表示前\(i\)个玩具所需的最小费用,则有$$dp[i]=min\{dp[j]+(sum[i]-sum[j]+i-(j+1)-l)^2(1<=j<i)\}$$

其中\(sum[i]\)表示的是\(c[i]\)的前缀和.

为了方便,我们设$$A[i]=sum[i]+i,l=l+1$$

于是原方程久等价于$$dp[i]=min\{dp[j]+(A[i]-A[j]-l)^2(1<=j<i)\}$$

我们设\(j<k<i\)且在计算\(dp[i]\)的时候,决策\(k\)更优.也就是说$$dp[k]+(A[i]-A[k]-l)^2<dp[j]+(A[i]-A[j]-l)^2$$

在纸上写写画画,把式子打开再遍一下形,容易得到$$\frac{[dp[k]+(A[k]+l)^2]-[dp[j]+(A[j]+l)^2]}{2\times{A[k]}-2\times{A[j]}}<A[i]$$

是不是很像$$\frac{Y_k-Y_j}{X_k-X_j}$$的形式?

这玩意儿不就是斜率吗?!我们设它为\(g(k,j)\)

我们可以发现\(A[i]\)是单调递增的,所以所有决策可以转化为二维空间上的点集.

也就是说\(k\)这个点和\(j\)这个点的连线的斜率如果小于\(A[i]\),那么\(k\)这个决策就更优.

那么对于三个决策\(a<b<c\),如果有\(g(c,b)<=g(b,a)\),那么\(b\)决策一定不会被选中.为什么呢?我们来讨论一下(对于任意\(3<i<=n\)):

1.如果\(g(b,a)<A[i]\),那么必有\(g(c,b)<A[i]\),也就是\(c\)最优,选择决策\(c\).

2.如果\(g(b,a)>=A[i]\),那么\(b\)不是最优,最优可能是\(a\)或\(c\).

所以我们在新加入一个点的时候,就可以把它看作\(c\),然后把所有这样的\(b\)都去掉,直到\(g(c,b)>g(b,a)\),所以我们需要处理的斜率是单调递增的.

由于\(A[i]\)是单调递增的,所以对于任意的\(i<n\),如果满足上面的不等式,那么对于任意的\(i',i<i<=n\),由于\(A[i']>A[i]\),所以上不等式仍然成立,所以\(i'\)的最优决策的位置一定不比\(i\)的最优决策小.

这样我们就可以用一个单调队列分别维护队首和队尾啦.

 #include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn=+;
ll n,l,front,tail;
ll sum[maxn],A[maxn],dp[maxn],q[maxn];
inline ll pow_(ll x){ return x*x; }
inline ll up(int k,int j){ return dp[k]-dp[j]+pow_(A[k]+l)-pow_(A[j]+l); }
inline ll dn(int k,int j){ return *(A[k]-A[j]); }
int main(){
scanf("%lld%lld",&n,&l);
l++;
for(int i=;i<=n;i++){
ll t; scanf("%lld",&t);
sum[i]=sum[i-]+t;
A[i]=sum[i]+i;
}
front=,tail=;
for(int i=;i<=n;i++){
while(front+<tail&&up(q[front+],q[front])<=A[i]*dn(q[front+],q[front])) front++;
int j=q[front]; dp[i]=dp[j]+pow_(A[i]-A[j]-l);
while(front+<tail&&up(i,q[tail-])*dn(q[tail-],q[tail-])<=up(q[tail-],q[tail-])*dn(i,q[tail-])) tail--;
q[tail++]=i;
}
printf("%lld\n",dp[n]);
return ;
}

1010: [HNOI2008]玩具装箱toy

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 8864  Solved: 3529
[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

HINT

Source

BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)的更多相关文章

  1. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

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

  2. [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp

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

  3. 【HNOI2008】玩具装箱TOY & 斜率优化学习笔记

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

  4. 【BZOJ1010】【HNOI2008】玩具装箱toy (斜率优化DP) 解题报告

    题目: 题目在这里 思路与做法: 这题不难想. 首先我们先推出一个普通的dp方程: \(f_i = min \{ f_j+(i-j-1+sum_i-sum_j-L)^2\}\) 然后就推一推式子了: ...

  5. BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1096 有\(n\)个工厂,给出第\(i\)个工厂的到1号工厂的距离\(x[i]\),货物数量\ ...

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

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

  7. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

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

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

  9. 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp

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

随机推荐

  1. eclipse4.2.1插件安装(二)之Eclipse HTML Editor

    编辑一些页面文件,例如JSP,HTML,JS等,直接用内置的文本编辑器基本比较疯狂,自己选了一个顺手的编辑器,Eclipse HTML Editor! Eclipse HTML编辑器插件主要提供以下功 ...

  2. 从客户端中检测到有潜在危险的 Request.Form 值] 处理办法

    当asp.net提交<>这些字符到aspx页面时,如果未设置 validaterequest="false",就会出现错误:从客户端(<?xml version= ...

  3. mysql的1045解决方法

    mysql的连接方式有两种: UNIX域套接字连接,如: mysql -u root -p mysql -h localhost -u root -p TCP/IP套接字连接,如: mysql -h ...

  4. IIS 10.0 无法安装 URL rewrite重写模块 2.0

    打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp位置 把MajorVersion的值改为9之后,就可以安装了,安装完成之后,再把Major ...

  5. 一些SVN 地址

    lockbox3 地址: https://svn.code.sf.net/p/tplockbox/code/trunc indy10 地址:https://svn.atozed.com:444/svn ...

  6. Codeforces Round #334 (Div. 1) C. Lieges of Legendre

    Lieges of Legendre 题意:有n堆牛,每堆有ai头牛.两个人玩一个游戏,游戏规则为: <1>从任意一个非空的堆中移走一头牛: <2>将偶数堆2*x变成k堆,每堆 ...

  7. 2016041601 - maven用途

    以前只是使用maven只是当成jar依赖管理工具,并没有想到它有多么厉害的功能.现在看书系统学习maven才发现它的强大之处.个人认为通过博客去学习掌握一门技术,这是很低层次的学习方法.学习金字塔,学 ...

  8. UML用户指南--UML图简介

    本节和大家一起学习一下UML图,这里主要介绍UML结构图和UML行为图两部分,下面让我们一起看一下UML图的详细介绍吧. UML图 这里再次提到对软件体系结构进行可视化.详述.构造和文档化,有5种最重 ...

  9. iostream/fstream中的输入输出流指针的绑定,tie函数的使用。

      为了兼容c语言的输入输出,c++里面采用tie将输入输出流经行绑定,所以cin/cout并不是独立的.当执行cin时,cout同时会被执行.反之亦然. by defalut,cin is tied ...

  10. CFNetwork学习总结