BZOJ 3437 斜率優化DP

2021-08-09 19:27:27 字數 1332 閱讀 4304

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

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

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

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

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

2 4 2 4

3 1 4 2

9樣例解釋

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

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

hint:ai、bi資料範圍有誤,須用ll.

題解:先寫出轉移方程:dp[ i ] = min + a[ i ]

拆一下變成:dp[ i ] = min + a[ i ]

顯然我們需要維護兩個字首和 sum1[ i ] = ∑b[ j ] ( 1<=j<=i )  sum2[ i ] = ∑j*b[ j ] ( 1<=j<=i )

進而方程變為:dp[ i ] = min + a[ i ]

然後通過推導發現滿足斜率不等式的優化條件。於是整體複雜度變成o(n)的

code:

#includeusing namespace std;

const int maxn = 1e6+100;

typedef long long ll;

ll a[maxn],b[maxn];

ll sum1[maxn],sum2[maxn];

ll dp[maxn];

int q[maxn],l,r;

int n;

inline ll x(int k,int j)

inline ll y(int k,int j)

inline ll getdp(int i,int j)

void input()

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

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

}void solve()

cout<}int main()

bzoj3437 小p的牧場 斜率優化dp

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

BZOJ3437 小P的牧場(斜率優化dp)

傳送門 這種題就是用來水的。fi max si表示總費用和,di表示距離 相當於題目中有多少個點 ci表示放養數量,ai表示費用,都是字尾和。喔然後斜率優化。include include include using namespace std define ll long long const i...

bzoj 3437 小P的牧場(斜率優化DP)

time limit 10 sec memory limit 128 mb submit 994 solved 566 submit status discuss 背景 小p是個特麼喜歡玩mc的孩紙。描述小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n...