BZOJ 3156 防禦準備

2022-05-21 12:57:13 字數 2234 閱讀 9880

第一行為乙個整數n表示戰線的總長度。

第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。

共乙個整數,表示最小的戰線花費值。

102 3 1 5 4 5 6 3 1 2

181<=n<=10^6,1<=ai<=10^9

這道題顯然是一道dp的題。一眼看去,顯然可以令$f_i$表示第$i$個位置放防禦塔的費用(先說明一下,為了方便計算,我把序列反向後從左到右計算),令$w_x=\sum_^i$,那麼顯然有:$f_=\min\\}+a_$。然而這是個$n^2$的dp方程,那麼怎麼做呢?翻了翻網上的題解,發現幾乎都寫了斜率優化。然而xzy神犇告訴我決策單調性可做。

怎麼做呢?不難發現對於位置$i$有兩個決策$j,k(j若對於$jf_k+w_$

因為$ji$有$w_-w_>w_-w_$

所以$f_j+w_>f_k+w_$

於是我們就可以做了。我們維護乙個單調佇列,每次先把隊首用不到的區間先彈掉,再用隊首元素來更新當前答案,最後用這個解來更新後面的解。當我們發現 對於隊尾區間的左端點當前解比佇列中儲存的解更優時,我們可以直接把這個區間給彈掉(想一想,為什麼)。這樣彈完以後,若佇列中已經沒有區間,我們就可以將當前解的區間直接加入佇列;否則當前解最優的邊界就在隊尾的區間中,我們需要在這個區間內二分把這乙個邊界給找出來,然後更改這個區間的右邊界並插入區間。

這道題是我練習決策單調性優化dp的第一題,對於新手來說還是有一點難度的。**如下:

1 #include2 #include3

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

4#define maxn 1000010

5#define inf (1ll<<50)67

using

namespace

std;

8 typedef long

long

llg;910

intn,a[maxn],l[maxn],r[maxn],x[maxn],lz,rz;

11llg f[maxn];

1213

intgetint()

2122 inline llg sum(int j,int i)

2526

intmain()

44 r[rz-1]=ll-1; l[rz]=ll,r[rz]=n+1,x[rz++]=i;//

修改並插入45}

46}47 printf("

%lld

",min(f[n],f[n+1

]));

48return0;

49 }

view code

upd:斜率優化做法:

其實這個式子可以推一推。由於$w_x=\frac$,所以有:$f_i=\min\ \}+a_i$

於是對於某乙個$j$,有$2f_i-i^2+i-2a_i=2f_j+j^2+j-2ij$

這就是個很顯然的斜率式了。由於$i$、$j$單增,用乙個單調佇列維護下凸包即可。

**如下:

1 #include2 #include3 #include4 #include5 #include6

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

7#define maxn 100001089

using

namespace

std;

10 typedef long

long

llg;

1112

struct

datas[maxn];

15int

n,a[maxn],d[maxn],l,r;

16llg f[maxn];

1718

intgetint()

2627 llg ji(int x)

28double

xie(data x,data y)

3233

intmain()

46 printf("

%lld

",min(f[n],f[n+1

]));

47return0;

48 }

view code

bzoj 3156 防禦準備

第一行為乙個整數n表示戰線的總長度。第二行n個整數,第i個整數表示在位置i放置守衛塔的花費ai。共乙個整數,表示最小的戰線花費值。10 2 3 1 5 4 5 6 3 1 2 181 n 10 6,1 ai 10 9 暴力就不多說了 include include include include i...

BZOJ 3156 防禦準備

1 n放城堡 木偶,在第i位放城堡的 cost i 給出,放木偶的 cost i j i j為i右邊第乙個城堡 問最小花費普通 theta dp會掛 n leq 100000 需要斜率優化,為了方便,我們從左往右dp f i 為在這個點放城堡的最小花費 因為第n個必須放城堡 f i min j i ...

bzoj3156防禦準備

bzoj3156防禦準備 題意 n個檢查點,在第i個檢查點放置塔花費a i 放置木偶花費為該位置右邊最近乙個塔離它的距離。求最小花費。n 1000000 題解 從右往左處理。在第i個點放塔的費用f i min a i 用等差數列求和公式化簡後作斜率dp,具體看 反思 本弱公式總是推錯,要穩!1 in...