首先能夠很簡單的得到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 作為這一組人的左端點 右端點...