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