bzoj3437 小P的牧場

2022-05-31 04:12:10 字數 1506 閱讀 5741

time limit: 10 sec  memory limit: 128 mb

submit: 947  solved: 542

[submit][status][discuss]

背景小p是個特麼喜歡玩mc的孩紙。。。

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

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

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

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

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

42424

3142

9【題解】

f[i]表示前i個牧場被控制的最小代價,sumb表示b陣列的字首和,sumkb表示 b[i]*i 的字首和

則狀態轉移方程:f[i]=min  (1<=j

設j得斜率表示式:[(f[j]-sumkb[j])-(f[k]-sumkb[k])]/(sumb[j]-sumb[k])>i

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9 typedef long

long

ll;10

#define file "read"

11#define maxn 1000100

12#define up(i,j,n) for(ll i=j;i<=n;i++)

13namespace

init

16inline ll read()

19while(isdigit(ch))

20return x*f;21}

22 }using

namespace

init;

23ll n,head,tail,a[maxn],b[maxn],sumb[maxn],sumkb[maxn],q[maxn],f[maxn];

24void

init()

29 inline double slop(ll j,ll k)

30void

solve()

38 printf("

%lld\n

",f[n]);39}

40int

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

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