bzoj 1911斜率優化

2021-10-07 23:50:19 字數 1243 閱讀 3653

這個題為什麼有個*???

關於斜率優化又有了新的感悟

對於次優解的排除:假設對於i來說l是次優解。即滿足k(q[l],q[l+1])<=k(i)時,l+1比l更優

k(q[l],q[l+1])表示這兩個點連成一條線的斜率,k(i)表示在i處那根線的斜率,這個很容易就可以證明

對於提前排除不可能的解:假設r是考慮排除的點,now是考慮放入的點,即滿足k(q[r-1],q[r])>=k(q[r],now)時,應該提前排除r

這個證明也特別簡單,就是不等式換算一下

二更:前面的話純屬放屁,有的斜率優化的題如果用k判斷的話會有精度損失**double)然後導致不能ac。應該只用乘法不用除法,最好寫個x(i)巨集和y(i)巨集,不要使用k。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define imax 2147483646

#define linf 0x3f3f3f3f3f3f3f3f

#define ll long long

#define ull unsigned long long

#define uint unsigned int

using

namespace

::std;

const

int maxn =

1111111

;ll n, a, b, c, q[maxn]

;ll aa[maxn]

,sum[maxn]

, f[maxn]

;#define k(x,y) ((double)(f[y] - f[x] + a * sum[y] * sum[y] - a * sum[x] * sum[x] - b * sum[y] + b * sum[x]) / (a * (sum[y] - sum[x]) * 2))

intmain()

printf

("%lld\n"

, f[n]);

return0;

}

BZOj 1911 斜率優化 DP

首先能夠很簡單的得到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 ...

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

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

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...