BZOJ 1010 HNOI2008 玩具裝箱

2021-09-27 12:07:50 字數 1500 閱讀 5354

time limit: 1 sec  memory limit: 162 mb

submit: 11907  solved: 5071

[submit][status][discuss]

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

141

很明顯這是一道dp題目,狀態轉移方程也很顯然

f[i]=min(f[j]+(sum[i]-sum[j]+i-j-1-l)^1) (1<=j很明顯這樣的dp複雜度為n^2

我們考慮用斜率去優化這個dp狀態轉移

這個式子看起來太複雜了,我們用一些陣列去存一下中間變數的加減

我們用t[i]表示sum[i]+i-l    用tt[i]表示sum[j]+1+j

那麼上述式子就可以表示為 f[i]=min(f[j]+(t[i]-tt[j])^2)

當j比k決策更優時則必然有 f[j]+(t[i]-tt[j])^2化簡得 (f[j]-f[k]+tt[j]^2-tt[k]^2)/(tt[j]-tt[k])<2*t[i] 

這樣就可以像之前一樣維護乙個單調佇列了

如果具體實現上還不清楚 看**

判斷更優時可以寫成乙個函式solpe 注意精度要用double

#include #define ll long long

using namespace std;

inline int read()

while(isdigit(ch))

return x*f;

}const int maxn=1e6+10;

namespace zhangenming,n,sum[maxn]={},t[maxn],tt[maxn],l,q[maxn<<1],head=1,tail=0;

void init()

} inline double solpe(int xx,int yy)

void solve(){

f[0]=0;

q[++tail]=0;

for(int i=1;i<=n;i++){

//cout

BZOJ1010 HNOI2008 玩具裝箱toy

先把程式放著,週末來更新 華麗的分割線 不想寫題解了。照著網上的題解推一邊即可 注意有的題解最後推倒出來明明是求上 下 凸包的形式,但配的圖卻是下 上 凸包的。不過斜率優化還不是搞的很懂。time limit 1 sec memory limit 162 mb submit 6661 solved ...

HNOI2002 bzoj1010 玩具裝箱

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

BZOJ 1010 HNOI2008 玩具裝箱

看到本題以後,分析了一下,發現是dp,然後看了下資料規模會超時。後來看了hzw的題解才發現是需要斜率優化的,方程是看懂了但是證明還是有點迷迷糊糊。最後,判斷函式是對著hzw的標程打的,剩下自己手擼掉了,程式並不長,但思想很秒。include include include include using...