BZOJ1010 玩具裝箱toy

2022-07-19 23:57:32 字數 1390 閱讀 3036

斜率優化dp。首先比較容易想到:

但是很不幸,由上式的可以看出這實際上要用到兩層迴圈,而資料量為50000,如果這樣做,肯定超時,這時候需要斜率優化了。

如果遞推式能變成

,且單調,則可使用斜率優化。

我們將式變形,令

,則由此判斷可以使用斜率優化。

關鍵的來了:

如果我們認為的兩個方案且的方案的方案好則:

$dp[j]+(g[i]-g[j]-c)^2\leq dp[k]+(g[i]-g[k]-c)^2$

$\frac > g[i]$

然後將令

,可以看出這個分式實際上就表示斜率,由這個斜率我們可以得出,如果

的方案的方案好,則必須滿足

式,所以我們現在只需要將最有方案放在乙個佇列裡,然後維護這個佇列就行了,也就是凸包的維護。

我講下我個人當時最難理解的地方,為什麼最優解在凸包上。

如上圖所示,不在凸包上有兩種情況,一種是f,一種是d。如果f在佇列裡,很明顯,斜率為負的,不符合,排除,如果d在佇列裡,cd的斜率小於cb斜率,可得cb最優,所以排除d。

然後是凸包的維護方法。

首先是取。如果時,

是由轉移而來,因為如果不滿足不等式,說明方案並不是最有的,直接剔除,如果滿足不等式,則當前這個點就是最優解,因為由

函式知道,

優於。然後是加。如果$slope(q[back],i)code:

#define frp

#include#include #include #include #include #include #include using namespace std;

typedef long long ll;

const ll inf = 0x3f3f3f3f;

const ll inf = 0x7fffff;

const int maxn = 1e6;

const int maxn = 1100000 + 10;

const int mod = 1e9 + 7;

ll dp[maxn],sum[maxn],q[maxn];

int c,l;

double slope(int i,int j)

void solve()

for(ll i=1;i

int front=1,back=1;

q[back]=0;

for(int i=1;i

cout<

}int main()

BZOJ1010 玩具裝箱toy

1010 hnoi2008 玩具裝箱toy time limit 1 sec memory limit 162 mb submit 7631 solved 2924 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任...

BZOJ1010玩具裝箱Toy

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

BZOJ1010 玩具裝箱toy

題目鏈結 bzoj1010 題目大意把n 個數分成若干段,從i到 j 分為一段的花費co st i j jk iva l k j i 求最小花費。分析 1.斜率優化dp,dp i min dp j co st j 1 i 2.先把l 1 設f x xk 1 val k x ff x d p x f ...