洛谷 P3628 APIO2010 特別行動隊

2021-07-30 16:32:52 字數 1604 閱讀 1102

題目描述

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

通過長期的觀察,你總結出一支特別行動隊的初始戰鬥力 x 將按如下經驗公 式修正為 ,其中 a, b, c 是已知的係數(a < 0)。 作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊修正後 戰鬥力之和最大。試求出這個最大和。

例如,你有 4 名士兵, 。經驗公式中的引數為 a = –1, b = 10, c = –20。此時,最佳方案是將士兵組成 3 個特別行動隊:第一隊包含士兵 1 和士兵 2,第二隊包含士兵 3,第三隊包含士兵 4。特別行動隊的初始戰鬥力分 別為 4, 3, 4,修正後的戰鬥力分別為 4, 1, 4。修正後的戰鬥力和為 9,沒有其它 方案能使修正後的戰鬥力和更大。

輸入輸出格式

輸入格式:

輸入由三行組成。第一行包含乙個整數 n,表示士兵的總數。第二行包含三 個整數 a, b, c,經驗公式中各項的係數。第三行包含 n 個用空格分隔的整數 ,分別表示編號為 1, 2, …, n 的士兵的初始戰鬥力。

輸出格式:

輸出乙個整數,表示所有特別行動隊修正後戰鬥力之和的最大值。

輸入輸出樣例

輸入樣例#1:

4 -1 10 -20

2 2 3 4

輸出樣例#1:

9 說明

20%的資料中,n ≤ 1000;

50%的資料中,n ≤ 10,000;

100%的資料中,1 ≤ n ≤ 1,000,000,–5 ≤ a ≤ –1,|b| ≤ 10,000,000,|c| ≤ 10,000,000,1 ≤ xi ≤ 100

【分析】

非常科學,非常優雅。

列個式子得到解。

【**】

#include

#include

#include

#define inf 1e9+7

#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

const int mxn=1000005;

ll n,a,b,c,h,t;

ll dp[mxn],res[mxn],q[mxn];

inline double g(ll k,ll j) //k1]-dp[j-1]+a*(res[k-1]*res[k-1]-res[j-1]*res[j-1])+b*(res[j-1]-res[k-1]);

ll down=2

*a*(res[k-1]-res[j-1]);

return (double)up/(double)down;

}int main()

h=1,t=0;

fo(i,1,n)

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

return

0;}

洛谷 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 然後斜率優化,單調佇列...

P3628 APIO2010 特別行動隊

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

P3628 APIO2010 特別行動隊

轉移方程 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 最大值,於是維護上凸包 橫座標單調增,斜率單調減,所以直接上單調佇列即可。in...