這題還是比較炫的
題目鏈結
我們設f[i]是已經裝了前i個玩具,且第i個玩具是某箱子裡裝的最後乙個東西(廢話)
那我們很輕鬆可以想到乙個轉移方程
for(int i=1;i<=n;++i)for(int j=0;jj)
f[i]=min(f[i],f[j]+squa(sum[i]-sum[j]+i-j-1-l)
其中sum是玩具長度的字首和,squa是平方。
但是o(50000*50000)瞬間**
我們設f[i]是由f[j]轉移過來的,j是最優轉移,同時還有乙個不那麼優的轉移k
那肯定有\(f[j]+squa(sum[i]-sum[j]+i-j-1-l)我們設\(m=sum[i]-1-l,t[j]=sum[j]+j\)
容易發現m只和i有關,t只和j有關
然後\(f[j]+squa(m-t[j])兩邊平方和展開劃一劃得到
\(((f[j]+squa(t[j]))-(f[k]+squa(t[k])))/(2*(t[j]-t[k]))>m\)
注意到f,t,m都是單調的
於是可以單調佇列斜率優化
為什麼是斜率優化呢?因為左面那個大於m的東西看著像斜率啊
附上乙個講斜率優化的部落格
yybyyb
**
#include#include#include
#include
#include
#include
using
namespace
std;
inline
long
long
read()
while
(isdigit(ch))
return num*f;
}long
long f[1000200
];long
long m[1000200
];long
long t[1000200
];long
long c[1000200
];int s[1000200
],h,t;
inline
long
long squa(long
long a)
inline
long
long count(int x,int y)
intmain()
for(int i=1;i<=n;++i)
printf(
"%lld
",f[n]);
return0;
}
luogu P3195 玩具裝箱 斜率優化題解
題意簡述 現有n 個物品,第 i個物品的長度為ci 可以製造若干個容器,容器的數量和長度不限制,但是只能把連續若干個物品放入容器中。把物品區間 i,j 放入同乙個容器中,長度為 每乙個容器的製造代價為,l 為給定常數。求最小代價之和。資料範圍 對於100 的資料,原題鏈結 如果只要部分分,那麼容易設...
洛谷3195玩具裝箱(斜率優化)
題目描述 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...
P3195 HNOI2008 玩具裝箱TOY
題目描述 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1 n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...