APIO2010特別行動隊(單調佇列 斜率優化)

2022-05-12 13:34:02 字數 1396 閱讀 5728

其實這題一看知道應該是dp,再一看資料範圍肯定就是單調佇列了。

不過我還不太懂神馬單調佇列、斜率優化……

附上天牛的題解:

1

var f,g:array[0..1000050] of

int64;

2 s,q:array[0..1000050] of

longint;

3a,b,c,n,i,h,t,x:longint;

4bestk:double;

5procedure

init;

6begin

7readln(n);

8readln(a,b,c);

9 s[0]:=0;10

for i:=1

to n do

11begin

12read(x);

13 s[i]:=s[i-1]+x;

14end;15

end;

16function

k(x,y:longint):double;

17begin

18 exit(double(g[y]-g[x])/(s[y]-s[x]));

19end;20

procedure

main;

21begin

22 f[0]:=0;h:=1;t:=1;q[1]:=0;23

for i:=1

to n do

24begin

25 bestk:=double(2*a*s[i]);

26while (hand (k(q[h],q[h+1])>=bestk) do

inc(h);

27 f[i]:=int64(f[q[h]])+int64(a)*int64(s[i]-s[q[h]])*int64(s[i]-s[q[h]])

28 +int64(b)*int64(s[i]-s[q[h]])+int64(c);

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

30while (h+1

<=t) and (k(q[t],i)>k(q[t-1],q[t])) do

dec(t);

31inc(t);

32 q[t]:=i;

33end;34

end;

35procedure

print;

36begin

37writeln(f[n]);

38end;39

begin

40init;

41main;

42print;

43end.

view code

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