[BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)

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

Solution

  设$f[i]$表示前$i$个物品装箱所需最小花费。

  假设我们把$[j+1,i]$的物品装到一个箱子里,那么很容易得出dp方程:

  $f[i]=min\{f[j]+(i-j+(\sum_{k=j+1}^{i}c[k])-L)^{2}\}$

  现在要把这个$O(n^{2})$优化成$O(n)$:

  设$d[i]=d[i-1]+c[i]+1$,$P=L+1$,那么

  $f[i]=min\{f[j]+(d[i]-d[j]-P)^{2}\}$

  假设k<j<i,且j比k优,则:

  $f[j]+(d[i]-d[j]-P)^{2}<f[k]+(d[i]-d[k]-P)^{2}$

  化简后的结果是:

  $\frac{(f[j]+d[j]^{2})-(f[k]+d[k]^{2})}{d[j]-d[k]}<2*(d[i]-P)$

  将$f[j]+d[j]^{2}$看成$y_{j}$,将$d[j]$看成$x_{j}$,就变成了斜率的表达式。

  维护一个下凸壳($min$就是下凸壳,$max$就是上凸壳),找凸包上关于斜率$2*(d[i]-P)$的切点,该店就是决策点。

  说右凸壳的都给我狗带!狗带!!!

  由于满足决策单调性,所以决策$j$是单调不下降的,我们可以把多余的斜率删掉。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long f[50005], c[50005];
 4 int q[50005];
 5
 6 double pow(long long x)
 7 {
 8     return 1.0 * x * x;
 9 }
10
11 double slope(int x)
12 {
13     return (f[q[x]] + pow(c[q[x]]) - f[q[x - 1]] - pow(c[q[x - 1]])) / (c[q[x]] - c[q[x - 1]]);
14 }
15
16 int main()
17 {
18     int n, l, front = 0, back;
19     cin >> n >> l;
20     for(int i = 1; i <= n; ++i)
21     {
22         cin >> c[i];
23         c[i] += c[i - 1] + 1;
24     }
25     ++l;
26     q[back = 1] = 0;
27     for(int i = 1; i <= n; ++i)
28     {
29         while(front + 1 < back && slope(front + 2) <= 2 * (c[i] - l))
30             ++front;
31         int j = q[front + 1];
32         f[i] = f[j] + (long long)pow(c[i] - c[j] - l);
33         q[++back] = i;
34         while(front + 1 < back && slope(back - 1) >= slope(back))
35             q[--back] = i;
36     }
37     cout << f[n] << endl;
38     return 0;
39 }

时间: 2024-08-05 07:09:27

[BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)的相关文章

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

1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器

HNOI2008玩具装箱 (斜率优化)

总算A了,心情好激动-- 如果会了一类斜率优化,基本上这类题就成了套模版了-- 只是k函数不同 1 var n,l,x,tail,head,m:int64; 2 i,j:longint; 3 dp,q,s:array[0..100000] of int64; 4 function k(x,y:longint):double; 5 begin 6 k:=1.0*((dp[x]+s[x]*s[x]-dp[y]-s[y]*s[y])/(s[x]-s[y])); 7 end; 8 procedure m

【斜率优化】BZOJ1010 [HNOI2008]玩具装箱toy

[题目大意] P教授有编号为1...N的N件玩具,第i件玩具长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关, 如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量.求最小费用. [思路] 懒得说了,把WC宋新波老师的课件搬运一下. 宋新波老师讲的很好,WC的时候第一次听斜率优化听他讲完秒懂了,时隔几个月再来消化一下.

bzoj1010: [HNOI2008]玩具装箱toy(斜率优化DP)

codevs也有这题,伪·双倍经验233 首先朴素DP方程很容易看出:f[i]=min(f[j]+(i-j-1+sum[i]-sum[j]-L)^2); 于是设g[i]=i+sum[i] g[j]=j+sum[j] c=1+L 则f[i]=min(f[j]+(g[i]-g[j]-c)^2) 证明决策单调性,假设 j 比 k 优 f[j]+(g[i]-g[j]-c)^2<f[k]+(g[i]-g[k]-c)^2 证明f[j]+(g[x]-g[j]-c)^2<f[k]+(g[x]-g[k]-c)^

BZOJ1010:[HNOI2008] 玩具装箱toy(斜率优化)

题意 求将一个长为\(n\)的序列(每个数为\(c_i\))分为很多段,每段(\(i\)~\(j\))的花费是\((j-i+\sum_{k=i}^{j}c_k-L)^2\),求最小的花费.(\(n<=50000\)) 题解 容易看出\(dp\)式子如下 \(dp[i]=min\{dp[j]+(sum[i]-sum[j]+i-(j+1)-L)^2\} \quad (j < i)\) 这个式子为\(O(n^2)\)的复杂度,显然过不去,我们进行一下斜率优化就能优化一维枚举决策点的复杂度,变成\(O

BZOJ1010: [HNOI2008]玩具装箱toy

[传送门:BZOJ1010] 简要题意: 给出n条连续线段,每条线段都有长度为x[i],我们可以把连续若干条线段连在一起,变成一个组合,两条线段如果相连,就要在两条线段中间添加一个长度为1的格子(如果没有相连就不用添加),假如我们现在选择把第i条到第j条线段之间的所有线段变成一组合的话,这个组合的总长度就为:x[i]+x[i+1]+x[i+2]+x[i+3]+...+x[j]+j-i,现在给出一个常数L,假设当前选择的组合的长度为s,那么这个组合就为我们产生了(s-L)^2的费用,求出把n条线段

bzoj 1010 玩具装箱toy -斜率优化

P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的

P3195 [HNOI2008]玩具装箱TOY DP+优化

题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j

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

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P