1010 HNOI2008 玩具裝箱toy

2021-07-08 20:20:37 字數 3165 閱讀 4076

time limit: 1 sec  

memory limit: 162 mb

submit: 7763  

solved: 2981 [

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)^2)

顯然肯定超時呀。。

設t[i] = sum[i] + i;x[i] = t[i] - 1 - l

於是原式等價於

f[j] + x[i]^2 - 2*t[j]*x[i] + t[j]^2;

不妨設 j

如果取k時的方案比j優

則f[j] + x[i]^2 - 2*t[j]*x[i] + t[j]^2 >f[k] + x[i]^2 - 2*t[k]*x[i] + t[k]^2

略加整理得

(f[j] + t[j]^2 - f[k] - t[k]^2) / (t[j] - t[k]) < 2*x[i]

//由於t陣列肯定是單調遞增的,所以除過來不等式要變號。。

這樣不等式左邊就是乙個斜率一樣的東西

另j,k的斜率為g[j,k]

若當前有a

設g[a,b] > g[b,c]

i:

g[b,c] < 2*x[i]

則c比b優

ii:

g[b,c] > 2*x[i]

則b比c優

但是同時g[a,b] > g[b,c] > 2*x[i]

於是a比b優

於是上面情況發生時可捨去b

所以考慮的任意斜率必須滿足單調遞增

假設維護乙個單調遞增的斜率佇列

則可找到一中間點使其左邊所有斜率 <= 2*x[i] 右邊所有斜率》= 2*x[i]

顯然此時改點最優

對於該點左邊的,既然當前斜率<=2*x[i]而x[i]是單調遞增的

所以這些點永遠比自己右邊的那個點差,所以捨去它們

這樣就可得到o(n)複雜度的演算法!

#include#includeusing namespace std;

const int maxn = 50050;

typedef long long ll;

typedef double db;

ll sum[maxn],x[maxn],t[maxn],n,i,j,f[maxn],l;

int q[maxn],head,tail = -1;

ll getnum()

return ret;}

db slope(int a,int b)

int main()

q[++tail] = 0;

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

while (tail > head && slope(q[head],q[head+1]) <= 2*x[i]) ++head;

j = q[head];

f[i] = f[j] + x[i]*x[i] - 2*x[i]*t[j] + t[j]*t[j];

while (tail - head >= 1 && slope(q[tail-1],q[tail]) >= slope(q[tail],i)) tail--;

q[++tail] = i;

}cout << f[n];

return 0;

}

1010 HNOI2008 玩具裝箱toy

題目鏈結 題目大意 把n個物品壓縮,一次可以把 l,r 區間的物品壓縮,有乙個費用,最小化費用 題解 斜率優化 推一下式子 還有 o nl ogn 的做法 我的收穫 斜率優化t1 include include include using namespace std define m 50005 i...

BZOJ1010 HNOI2008 玩具裝箱toy

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

BZOJ 1010 HNOI2008 玩具裝箱

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