HNOI2008 玩具裝箱

2022-04-09 11:31:27 字數 1193 閱讀 4817

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

輸出最小費用

5 4342

14斜率優化dp。

我們可以輕易寫出 n^2 的方程,f[i]=min(f[j]+(sum[i]-sum[j]-l)^2,f[i]);但是顯然會t。

把平方拆開。

\[f[j]+sum[i]^2+(sum[j]+l)^2-2 \cdot sum[i] \cdot (sum[j]+l)

\]把sum[j]+l視作y[j],f[j]+(sum[j]+l)^2視作x[j],那麼就可以維護凸殼。

如**

//writer : hsz %wjmzbmr%tourist%hzwer

#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

int n,l,q[500005],hd,tl;

int c[500005],f[500005],sum[500005];

int sqr(int x)

int a(int x)

int b(int x)

int x(int j)

int y(int j)

double slope(int a,int b)

int main()

cout

}

HNOI 2008 玩具裝箱

p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為 1.n 的 n 件玩具,第i件玩具經過壓縮後變成一維長度為 ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...

HNOI2008 玩具裝箱toy

重點在講斜率優化 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一...

HNOI2008 玩具裝箱toy

dp i min dp j sum i sum j c 2 dp k sum i sum k c 2 dp k si sum k 2 dp k si 2 2 si sum k sum k 2 dp k sum k 2 dp j sum j 2 2 si sum k sum j yk yj 2 si ...