APIO2010 特別行動隊

2021-08-22 03:17:25 字數 2034 閱讀 5333

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

i ​ +x

i+1

​ +…+x

i+k

​ 。通過長期的觀察,你總結出一支特別行動隊的初始戰鬥力 x 將按如下經驗公 式修正為 x』:x』= ax^2+bx+cx

′ :x

′ =ax

2 +bx+c ,其中 a, b, c 是已知的係數(a < 0)。 作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊修正後 戰鬥力之和最大。試求出這個最大和。

例如,你有 4 名士兵, x_1 = 2, x_2 = 2, x_3 = 3, x_4 = 4x

1 ​ =2,x

2 ​ =2,x

3 ​ =3,x

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

輸入格式:

輸入由三行組成。第一行包含乙個整數 n,表示士兵的總數。第二行包含三 個整數 a, b, c,經驗公式中各項的係數。第三行包含 n 個用空格分隔的整數 x_1, x_2, …, x_nx

1 ​ ,x

2 ​ ,…,x

n ​ ,分別表示編號為 1, 2, …, n 的士兵的初始戰鬥力。

輸出格式:

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

輸入樣例1

4 -1 10 -20

2 2 3 4

輸出樣例1

920%的資料中,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

首先還是寫出乙個 o(n^2) 的dp

for(int i=1;i

<=n;++i)

for(int j=0;j

f[i]=max(f[i],f[j]+f(c[i]-c[j]));

其中 f(x) 是題目中的二次函式 c[i] 是字首和

假設 j 的轉移優於 k

那麼就有 f[j]+f(c[i]-c[j])>f[k]+f(c[i]-c[k])

又有 f(x)=a(x)^2+bx+c

直接帶入得到

f[j]+a(c[i]-c[j])^2+b(c[i]-c[j])+c

右邊同理

然後兩邊同時減掉一部分得

f[j]+ac[j]^2-2ac[i]c[j]-bc[j]>f[k]+ac[k]^-2ac[i]c[k]-bc[k]

然後就可以斜率優化直接搞了

#include

#include

#include

#define ll long long

#define maxn 1000010

using namespace std;

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

ll dp[maxn],q[maxn],head=1,tail=1;

double slope(ll j,ll k)

ll calc(ll i,ll j)

int main()

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

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

return

0;}

APIO2010 特別行動隊

dp方程 dp i max dp i dp j a sum i sum j 2 b sum i sum j c 暴力還是可以過一些點的 不止20pts 甚至有人說他暴力水過去了。我們現在考慮正解,正解還是斜率優化。維護乙個上凸包qwqwq 設 dp i 表示到士兵i所能達到的最大戰力,sum i 表...

APIO2010 特別行動隊

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

APIO 2010 特別行動隊

題目鏈結 演算法 設前i個士兵 修正 後的最大戰鬥力為fi 令sumi表示x的字首和 顯然 有狀態轉移方程 fi max 對該式進行化簡 得 fi max 令yj fj asumj 2 xj sumj 則 fi max 那麼yj xj 2asumi b fi asumi 2 bsumi c 顯然我們...