洛谷P3628 特別行動隊

2022-06-13 22:45:15 字數 1210 閱讀 8342

你有一支由 \(n\) 名預備役士兵組成的部隊,士兵從 \(1\) 到 \(n\) 編號,你要將他們拆分成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號應該連續,即為形如 \((i, i + 1, \cdots i + k)\)的序列。所有的隊員都應該屬於且僅屬於一支特別行動隊。

編號為 \(i\) 的士兵的初始戰鬥力為 \(x_i\) ,一支特別行動隊的初始戰鬥力 \(x\) 為隊內士兵初始戰鬥力之和,即 \(x = x_i + x_ + \cdots + x_\)。

通過長期的觀察,你總結出對於一支初始戰鬥力為 \(x\) 的特別行動隊,其修正戰鬥力 \(x'= ax^2+bx+c\),其中 \(a,~b,~c\) 是已知的係數(\(a<0\))。 作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊的修正戰鬥力之和最大。試求出這個最大和。

\(n\leq 10^6\)。

不記得從哪聽說這道題不是很模板?但是感覺還是模板啊qwq。

設 \(f[i]\) 表示前 \(i\) 個人分好組的最大和。設 \(s[i]=\sum^_x[i]\),顯然

\[f[i]=\max(f[j]+a(s[i]-s[j])^2+b(s[i]-s[j])+c)

\]展開,移項後得到

\[f[j]+a·s[j]^2-b·s[j]=2a·s[i]·s[j]+f[i]-a·s[i]^2-b·s[i]+c

\]那麼可以看做一條斜率為 \(2a·s[i]\),截距為 \(f[i]-a·s[i]^2-b·s[i]+c\) 的直線,決策點為 \((s[j],f[j]+a·s[j]^2-b·s[j])\) 的平面直角座標系。

由於 \(a<0\),那麼斜率滿足單調遞減,同時決策點的橫座標單調遞增,所以單調佇列維護上凸殼即可。

時間複雜度 \(o(n)\)。

#include #include #include #include using namespace std;

typedef long long ll;

const int n=1000010;

ll a,b,c,f[n],s[n],y[n];

int n,l,r,q[n];

ll read()

double slope(int x,int y)

int main()

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

return 0;

}

洛谷 P3628 APIO2010 特別行動隊

題目描述 你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如的序列。編號為 i 的士兵的初始戰鬥力為 xi 一支特別行動隊的初始戰鬥力 x 為隊內 士兵初始戰鬥力之和,即 通過長期...

洛谷 P3628 APIO2010 特別行動隊

將n個士兵分為若干組,每組連續,編號為i的士兵戰鬥力為xi 若i j士兵為一組,該組初始戰鬥力為 s sum limits xk 實際戰鬥力 a s 2 b s c a,b,c為常數 求最大實際戰鬥力 dp i max dp j a s i s j 2 b s i s j c 然後斜率優化,單調佇列...

洛谷 3628 APIO2010 特別行動隊

題目描述 你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如 i,i 1,i k i,i 1,i k i,i 1 i k 的序列。編號為 i 的士兵的初始戰鬥力為 x ix i x...