第一行為乙個整數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 #include3view code#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 }
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 #include6view code#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 }
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...