小p 在mc 裡有n 個牧場,自西向東呈一字形排列(自西向東用1…n 編號),於是他就煩惱了:為了控制這n 個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場(它西邊第乙個控制站所在的牧場不被控制)(如果它西邊不存在控制站,那麼它控制西邊所有的牧場),每個牧場被控制都需要一定的花費(畢竟在控制站到牧場間修建道路是需要資源的嘛~),而且該花費等於它到控制它的控制站之間的牧場數目(不包括自身,但包括控制站所在牧場)乘上該牧場的放養量,在第i 個牧場建立控制站的花費是ai,每個牧場i 的放養量是bi,理所當然,小p 需要總花費最小,但是小p的智商有點不夠用了,所以這個最小總花費就由你來算出啦。
第一行乙個整數n 表示牧場數目
第二行包括n 個整數,第i 個整數表示ai
第三行包括n 個整數,第i 個整數表示bi
只有一行,包括乙個整數,表示最小花費
42 4 2 4
3 1 4 2
【樣例解釋】
選取牧場1,3,4 建立控制站,最小費用為2+( 2 + 1 * 1 ) + 4 = 9。
【資料範圍】
對於10%的資料,1<=n<=10;
對於30%的資料,1<=n<=1000;
對於100%的資料,1<=n<=1000000, 0
一類斜率優化問題,x單增,斜率單增,注意數形結合。
#includeusing namespace std;
#define inc(i,l,r) for(register int i=(l);i<=(r);++i)
const int n = 1e6+10;
#define int long long
int n,a[n],b[n];
int s[n],ks[n];
inline void init()
int f[n],q[n];
inline int y(int j)
inline double slope(int j1,int j2)
inline void dp()
} cout<
}signed main()
bzoj 3437 小P的牧場
方程不難寫出fi max j 0 i 其中w j i 表示前 i 個牧場中,在 i處建立最後乙個檢查站,在 j 處建立倒數第二個檢查站的最小化費 這裡的w可以用兩個字首和求出,s1 i b i s2 i 1 a i 1 2 a i 2 3 a i 3 i 1 a 1 那麼w l,r s2 r s 2...
bzoj3437 小P的牧場
description 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如...
bzoj3437 小p的牧場
題幹 略。暴力做法 o n 2 強行無腦dp。整解 s1為一維字首和,s2為二維字首和 存 b i i f i min f j i s1 i s1 j s2 i s2 j 若 j 優於 k 則有 f j s2 j f k s2 k s1 j s1 k i 然後想起來 y x k 發現這道題是一道斜率...