其實這題一看知道應該是dp,再一看資料範圍肯定就是單調佇列了。
不過我還不太懂神馬單調佇列、斜率優化……
附上天牛的題解:
1view codevar 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.
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 一支特別行動隊的初...