BZOJ3437 小P的牧場 斜率優化dp

2021-08-11 10:59:59 字數 1640 閱讀 4741

time limit: 10 sec  

memory limit: 128 mb

submit: 1502  

solved: 836 [

submit][

status][

discuss]

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

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

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

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

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

42424

3142

9樣例解釋

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

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

與p1096倉庫建設很像,不過路徑權值變成了1

我們用乙個比較牛的字首和:s[i]為b[i]字首和,c[i]為b[i]字首和

那麼從j + 1全部搬到i的代價就是(s[i] - s[j]) * i - (c[i] - c[j])【想象一下】

那麼我們設f[i]表示在i建廠的最小代價

f[i] = min + a[i]

去掉常量化簡得到(f[j] + c[j]) = i * s[i] + f[i]

我們就的到了y = i * x + f[j]這樣的直線求截距最大,維護凸包就好了

#include#include#include#include#define eps 1e-9

#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define fo(i,x,y) for (int i = (x); i <= (y); i++)

#define redge(u) for (int k = head[u]; k != -1; k = edge[k].next)

using namespace std;

const int maxn = 1000005,maxm = 100005,inf = 1000000000;

inline ll read()

while (c >= 48 && c <= 57)

return out * flag;

}ll n,a[maxn],b[maxn],s[maxn],c[maxn],f[maxn],q[maxn],head,tail;

inline double slope(int u,int v)

inline ll getf(int i,int j)

int main()

cout<

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

time limit 10 sec memory limit 128 mb submit 1493 solved 830 submit status discuss 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站...

bzoj 3437 小P的牧場 斜率優化

time limit 10 sec memory limit 128 mb 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站...

bzoj3437 小p的牧場 斜率優化dp

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