APIO2010 特別行動隊

2022-08-12 16:18:21 字數 2462 閱讀 2949

apio2010 特別行動隊

【題目描述】

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

編號為 i 的士兵的初始戰鬥力為 xi ,一支特別行動隊的初始戰鬥力 x為隊內士兵初始戰鬥力之和,即 x = xi + xi+1 + … + xi+k。

通過長期的觀察,你總結出一支特別行動隊的初始戰鬥力 x將按如下經驗公式修正為x':x' = ax^2 + bx + c,其中 a, b, c是已知的係數(a 

作為部隊統帥,現在你要為這支部隊進行編隊,使得所有特別行動隊修正後戰鬥力之和最大。試求出這個最大和。

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

【輸入檔案】

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

【輸出檔案】

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

【輸入樣例】

4 -1 10 -20

2 2 3 4 

【輸出樣例】

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。 

【題目分析】

首先看到題目就可以知道這是一道動態規劃,然而樸素的n^2演算法只能拿到20分。

首先,對於這個題來說,其決策是單調的,這樣我們就可以用單調性把時間複雜度優化到nlogn,實踐證明這樣可以過7~8個點。

然後決策單調了,我們就會想到斜率……

設對於f[i],由k決策更新比j決策更優,且k

f[j]+a*(si-sj)^2+b*(si-sj)+c

轉化過程略,最後可以化為如下式子:

2*a*si>[(s*sj^2-b*sj+f[j])-(a*sk^2-b*sk+f[k])]/(sj-sk)

設g[i]=a*si^2-b*si+f[i],那麼我們就可以把si作為橫座標,g[i]作為縱座標來表示斜率,這樣就可以維護乙個凸形的曲線,每次把隊首斜率小於2*a*si的點出隊,用隊首的點計算f[i]和g[i],再用g[i]去維護佇列曲線的凸形。

【**實現】

code

1

program

test1;

2var s,f,g:array[0..1000000]of

int64;

3 d:array[0..1000000]of

longint;

4t,w,i,j,n:longint;

5a,b,c:int64;

6function

xl(i,j:longint):extended;

7begin

8 exit((g[j]-g[i])/(s[j]-s[i]));

9end;10

begin

11readln(n);

12readln(a,b,c);

13for i:=1

to n do

14begin

15read(s[i]);

16 inc(s[i],s[i-1

]);17

end;

18 t:=0;w:=0;d[0]:=0;g[0]:=0;19

for i:=1

to n do

20begin

21while (tand(xl(d[t],d[t+1])>=2*a*s[i]) do

inc(t);

22 j:=d[t];

23 f[i]:=f[j]+a*sqr(s[i]-s[j])+b*(s[i]-s[j])+c;

24 g[i]:=a*sqr(s[i])-b*s[i]+f[i];

25while (w>t)and(xl(d[w],i)>xl(d[w-1],d[w])) do

dec(w);

26inc(w);

27 d[w]:=i;

28end;29

writeln(f[n]);

30end.

APIO2010 特別行動隊

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

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 一支特別行動隊的初...