轉移方程:\(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]+c=2*a*s[i]*s[j]+f[i]-a*s[j]^2-b*s[i]\)
然後求\(f[i]\)最大值,於是維護上凸包;橫座標單調增,斜率單調減,所以直接上單調佇列即可。
#include#include#define r register int
#define ll long long
using namespace std;
namespace luitaryi const int n=1e6+10;
int n,a,b,c,h=0,t=0,q[n];
ll s[n],f[n];
inline double x(int i)
inline double y(int i)
inline double k(int i,int j)
inline void main() printf("%lld\n",f[n]);
}} signed main()
2019.08.16
84
P3628 APIO2010 特別行動隊
題目描述 你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如的序列。編號為 i 的士兵的初始戰鬥力為 xi 一支特別行動隊的初始戰鬥力 x 為隊內 士兵初始戰鬥力之和,即 通過長期...
P3628 APIO2010 特別行動隊
令 f i 表示前 i 個士兵組成特別行動隊的最大修正戰鬥力之和。對 x 做一遍字首和。轉移方程 f i max x i 兩個負的負負得正不用變號。因為 x i 隨著 i 的增大單調遞增,所以對 2a times x,f a times x 2 b times x 維護下凸包。code includ...
P3628 APIO2010 特別行動隊
你有一支由 n 名預備役士兵組成的部隊,士兵從 1 到 n 編號,要將他們拆分 成若干特別行動隊調入戰場。出於默契的考慮,同一支特別行動隊中隊員的編號 應該連續,即為形如 i,i 1,i k 的序列。編號為 i 的士兵的初始戰鬥力為 xi 一支特別行動隊的初始戰鬥力 x 為隊內 士兵初始戰鬥力之和,...