bzoj3437 小P的牧場

2021-08-14 15:33:53 字數 1445 閱讀 6451

description

小p在mc裡有n個牧場,自西向東呈一字形排列(自西向東用1…n編號),於是他就煩惱了:為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場(它西邊第乙個控制站所在的牧場不被控制)(如果它西邊不存在控制站,那麼它控制西邊所有的牧場),每個牧場被控制都需要一定的花費(畢竟在控制站到牧場間修建道路是需要資源的嘛~),而且該花費等於它到控制它的控制站之間的牧場數目(不包括自身,但包括控制站所在牧場)乘上該牧場的放養量,在第i個牧場建立控制站的花費是ai,每個牧場i的放養量是bi,理所當然,小p需要總花費最小,但是小p的智商有點不夠用了,所以這個最小總花費就由你來算出啦。

input

第一行乙個整數 n 表示牧場數目

第二行包括n個整數,第i個整數表示ai

第三行包括n個整數,第i個整數表示bi

output

只有一行,包括乙個整數,表示最小花費

sample input

4sample output

9樣例解釋

選取牧場1,3,4建立控制站,最小費用為2+(2+1*1)+4=9。

1<=n<=1000000, 0 < a i ,bi < = 10000

hint

source

kpmcup#0 by greens

基本同鋸木廠選址那題只不過這題距離變成1 更簡單一些的

f[i]=min 。表示在i建控制站,上乙個控制站建在j所需的最小花費。假設k1< k2且k1優於k2,則有(f[k2]-f[k1]+c[k1]-c[k2]+sw[k2]*k2-sw[k1]*k1)/(sw[k2]-sw[k1])>i。因此我們維護乙個下凸曲線,保證佇列中的斜率都是單增的。

設sw[i]表示1~i的放養量總和 那麼我可以o(n)算出cost[i]也就是我把1~i的只在i號位置建立乙個牧場 我的總代價是多少 cost[i]=cost[i-1]+sw[i-1]

有了這樣兩個陣列我就可以求出我將j~i全部用i控制的代價了 那就是cost[i]-cost[j]-sw[j]*(i-j) 我首先將他們認為1~j全部由j號點控制 那麼我只想要j~i由i控制 那麼顯然對於1~i全部由i控制我還多了sw[j]由i控制的代價

#include

#define ll long long

#define n 1100000

inline char gc()

return

*s++;

}inline int

read()

int n,a[n],q[n];ll f[n],cost[n],sw[n];

inline double slope(int j1,int j2)

int main()printf("%lld",f[n]);

return

0;}

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的牧場

小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 發現這道題是一道斜率...