BZOJ1911 特別行動隊

2022-03-31 14:18:24 字數 1126 閱讀 9653

目錄題目傳送門

典型的斜率優化\(dp\)。首先如果我們記\(sum[i]\)表示前\(i\)個士兵的戰鬥力之和,那麼我們比較容易的可以得出\(o(n^2)\)的\(dp\):\(f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c)\)。如果\(k>j\)並且\(k\)比\(j\)更優,那麼可以得出:

$\frac\leq sum[i]$

然後就是用單調佇列進行優化了。

#include using namespace std;

typedef long long ll;

bool finish_read;

templateinline void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}

templateinline void print(t x)

templateinline void writeln(t x)

templateinline void write(t x)

/****************=header template**********====*/

#define pause printf("press enter key to continue..."); fgetc(stdin);

const int maxn=2e6+500;

int n;

int a,b,c;

int x[maxn];

int l,r;

int que[maxn];

ll f[maxn],sum[maxn];

/****************===define area***************=*/

ll sqr(ll x)

double cal(int x,int y)

int main()

for(int i=1;i<=n;i++) sum[i]=sum[i-1]+x[i];

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

printf("%lld\n",f[n]);

return 0;

}

bzoj 1911 特別行動隊

題意 將 n 個人分組,分組後,乙個組的戰鬥力等於 a sum sum b sum c,怎麼分組使得戰鬥力和最大。分析 第一次自己從頭到尾推出來的斜率dp。狀態定義 d i 前 i 個人分組得到的最優值。狀態轉移 d i max d j a sum i sum j 2 b sum i sum j c...

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