HNOI2008 玩具裝箱TOY

2022-05-11 11:34:53 字數 1702 閱讀 7765

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 434

214

輸出樣例#1:

1

題解:

和上題一樣的套路哈.直接寫出原始dp方程,f[i]=f[j]+(sum[i]-sum[j]+i-j-l-1)^2

但是天真的小朋友,千萬把後面一塊全拆.分i,j兩部分即可

變為f[i]=f[j]+((sum[i]+i-l-1)+(-j-sum[j]))^2 然後開平方

最後變為斜率優化的標準形式:

(f[j]-f[k]+(j+sum[j])^2-(k+sum[k])^2)/(2*((-k-sum[k])-(-j-sum[j])))<=(sum[i]+i-l-1)

那麼(sum[i]+i-l+1)就是當前直線斜率,(f[j]-f[k]+(j+sum[j])^2-(k+sum[k])^2)就是y,(2*((-k-sum[k])-(-j-sum[j])))就是x.

直接維護凸殼即可 **好寫

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

using

namespace

std;

8 typedef long

long

ll;9

const

int n=50005;10

ll sum[n];

11int

gi()

17int

n,m,q[n];ll f[n];

18 ll fy(int i,int

j)21 ll fx(int i,int

j)24

void

work()

34 f[i]=f[q[l]]+(sum[i]-sum[q[l]]+i-q[l]-1-m)*(sum[i]-sum[q[l]]+i-q[l]-1-m);

35while(l<=r-1

)40 q[++r]=i;41}

42 printf("

%lld\n

",f[n]);43}

44int

main()

45

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 ...

HNOI2008 玩具裝箱TOY

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