BZOj 1911 斜率優化 DP

2021-07-14 13:11:43 字數 1544 閱讀 8754

首先能夠很簡單的得到dp方程:dp

i=mi

n(dp

j+fu

nc(s

umi−

sumj

))設有j ,

k滿足

j<

k 且決策j 比

k更優,就相當於:dp

j−dp

k+a∗

sum2

j−a∗

sum2

k+b∗

(sum

k−su

mj)−

2a∗(

sumj

−sum

k)∗s

umi>0

移項得:(f

j−fk

+a∗(

sum2

j−su

m2k)

+b∗(

sumk

−sum

j))/

(2a∗

(sum

j−su

mk))

>su

mi 設

fj+a

∗sum

2j−b

∗sum

j=yj

fk+a∗su

m2k−

b∗su

mk=y

k 2a

∗sum

j=xj

2a∗sumj

=xk

就得到了:(y

j−yk

)/(x

j−xk

)>su

mi這就是斜率,用單調佇列維護即可。

#include 

#include

#include

#define sqr(x) ((x) * (x))

#define n 1000010

using namespace std;

typedef long long ll;

ll sum[n], dp[n];

intq[n], x[n];

int h = 0, t = 0, a, b, c, n;

inline char get(void)

return

*p1++;

}inline void read(int &x)

inline double slope(int k, int j)

inline ll func(ll x)

int main(void)

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

cout << dp[n] << endl;

return

0;}

bzoj 1911斜率優化

這個題為什麼有個 關於斜率優化又有了新的感悟 對於次優解的排除 假設對於i來說l是次優解。即滿足k q l q l 1 k i 時,l 1比l更優 k q l q l 1 表示這兩個點連成一條線的斜率,k i 表示在i處那根線的斜率,這個很容易就可以證明 對於提前排除不可能的解 假設r是考慮排除的點...

bzoj1911 特別行動隊 斜率優化dp

ac通道 題解 首先很容易想到用字首和,下面的sum表示字首和。然後寫出狀態轉移方程 f i max 假設j比k更優,得到斜率表示式 f j a sum j 2 b sum j f k a sum k 2 b sum k sum j sum k 2a sum i 然後斜率優化走起。include i...

BZOJ 1911 特別行動隊 (斜率優化)

感覺這道題目還是比較常規的,首先我們很容易想到dp,因為題目裡面說了選出的人都是連續的,這意味著我們可以從前往後dp。我們直接設 f i 表示前 i 在分組之後的戰鬥力之和 因為題目沒有明確要求分幾組,所以我們省去這一維度 然後轉移也比較常規,我們列舉前面的某乙個人 k 作為這一組人的左端點 右端點...