其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了。
不过我还不太懂神马单调队列、斜率优化……
附上天牛的题解:http://www.cnblogs.com/neverforget/archive/2012/04/19/2456483.html
1 var f,g:array[0..1000050] of int64; 2 s,q:array[0..1000050] of longint; 3 a,b,c,n,i,h,t,x:longint; 4 bestk:double; 5 procedure init; 6 begin 7 readln(n); 8 readln(a,b,c); 9 s[0]:=0; 10 for i:=1 to n do 11 begin 12 read(x); 13 s[i]:=s[i-1]+x; 14 end; 15 end; 16 function k(x,y:longint):double; 17 begin 18 exit(double(g[y]-g[x])/(s[y]-s[x])); 19 end; 20 procedure main; 21 begin 22 f[0]:=0;h:=1;t:=1;q[1]:=0; 23 for i:=1 to n do 24 begin 25 bestk:=double(2*a*s[i]); 26 while (h<t) and (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]); 30 while (h+1<=t) and (k(q[t],i)>k(q[t-1],q[t])) do dec(t); 31 inc(t); 32 q[t]:=i; 33 end; 34 end; 35 procedure print; 36 begin 37 writeln(f[n]); 38 end; 39 begin 40 init; 41 main; 42 print; 43 end.