小 P 的牧場 題解

2022-02-15 01:10:24 字數 2164 閱讀 5122

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

第一行乙個整數 \(n\) 表示牧場數目。

第二行包括 \(n\) 個整數,第 \(i\) 個整數表示 \(a_i\)。

第三行包括 \(n\) 個整數,第 \(i\) 個整數表示 \(b_i\)。

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

4

2424

3142

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

對於 10% 的資料,\(1<=n<=10\),

對於 30% 的資料,\(1<=n<=1000\),

對於 100% 的資料,\(1<=n<=1000000\) , \(0。

題目中已經告訴了每個牧場建立控制站的花費 \(a_i\)。那麼我們設當前位置為 \(i\),在 \(i,j\) 處都建立控制站。對於不同的 \(j\),會有不同的情況。

這樣,狀態轉移方程就得出了,\(f[i]=f[j]+a[i]+\sum_^b[k]×(i-k)\)。範圍 \(1\leq j。

如果列舉 \(i,j,k\) 三重迴圈硬上,可能會獲得 10 分的好成績。很顯然,我們需要優化。

對於 \(\sum_^b[k]×(i-k)\),我們可以將其拆解,之後用字首和優化。我們記 \(sb[i]\) 為 \(b[i]\) 的字首和 ,\(sib[i]\) 為 \(i×b[i]\) 的字首和。

下面是對狀態轉移方程進行拆解並簡化的過程:

\[f[i]=f[j]+a[i]+\sum_^b[k]×(i-k)

\]\[f[i]=f[j]+a[i]+\sum_^b[k]×i-\sum_^b[k]×k

\]\[f[i]=f[j]+a[i]+(sb[i-1]-sb[j])×i-(sib[i-1]-sib[j])

\](上面第二個式子如果寫格式的有問題請不要在意,只要懂這個意思就行)

這樣,我們就把 \(o(n^3)\) 的複雜度優化成了 \(o(n^2)\)。

可是這樣只能拿 30 分,於是現學現賣用了個玄學的斜率優化。具體原理請參見 李煜東《演算法競賽高階指南》。

假設 \(k, 並且 \(f[j],即 \(j\) 比 \(k\) 優。

則可以得出:

\(f[j]+a[i]+(sb[i−1]−sb[j])×i−(sib[i−1]−sib[j])<\)

\(f[k]+a[i]+(sb[i−1]−sb[k])×i−(sib[i−1]−sib[k])\)

\[\frac < i

\]之後使用斜率優化,就可以開心地 ac 了。

#include 《標頭檔案》

using namespace std;

typedef long long ll;

inline ll read(){}

const int nn=1000002;

int n, a[nn], b[nn];

ll f[nn], sb[nn], sib[nn],q[nn]; //這些可能會很大,所以開 long long

inline double kk(int j, int k) //斜率

int main()

ll l = 1, r = 1;

for (int i = 1; i <= n; i++)

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

return 0;}/*

42 4 2 4

3 1 4 2

*/

edisonba

2021.2.24 初次編輯

題解 小p的新牧場 詳解斜率優化

小 p 是個特麼喜歡玩 mc 的孩紙。小 p 在 mc 裡有 n 個牧場,自西向東呈一字形排列 自西向東用 1 n 編號 於是 他就煩惱了 為了控制這 n 個牧場,他需要在某些牧場上面建立控制站,每個牧場 上只 能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控 制站 的所有牧...

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個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的牧場不被控制 如...