您的位置:首页 > 其它

bzoj 1911: [Apio2010]特别行动队 2011-12-26

2016-03-02 20:15 288 查看
1911: [Apio2010]特别行动队

Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 892 Solved: 359
[Submit][Status][Discuss]

Description

Input

Output

Sample Input4
-1 10 -20
2 2 3 4 Sample Output9HINT



Source

_________________________________________

很简单的动规方程: F[i]:=max(F[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)

用斜率式优化:

原方程展开: F[i]:=max(F[j]+a*s[i]^2-2*a*s[i]*s[j]+a*s[j]^2+b*s[i]-b*s[j]+c)

设g(i,j)为 F[i] 的一个决策

则 g(i,j)-g(i,k)=f[j]+a*s[j]^2-(f[k]+a*s[k]^2)-(b+a*s[i]^2)*(s[j]-s[k])

当 决策j 优于决策 k时 g(i,j)-g(i,k)>0

设 y[i]=f[i]+a*s[i]^2 , x[i]=s[i]

所以可化简为 (y[k]-y[j])/(x[i]-x[j])>b+a*s[i]^2

因为 a<0 所以 b+a*s[i]^2 单调递减。

_________________________________________

ProgramStone;
var i,j,head,tail,a,b,c,n:longint;     s,f,cons,sq,que:array[0..1000001]ofint64;
function delhead(i,j,k:longint):boolean;
begin
if cons[i]*(s[j]-s[k])>sq[j]-sq[k] then
exit(true)
else
exit(false);
end;
functiondeltail(i,j,k:longint):boolean;
begin
if(sq[i]-sq[j])*(s[j]-s[k])>(sq[j]-sq[k])*(s[i]-s[j])
then exit(true)
else exit(false);
end;
functionmax(a,b:int64):int64;
begin
ifa>b thenmax:=a elsemax:=b;
end;
Begin
readln(n);
readln(a,b,c);
fori:=1ton do   read(s[i]);
fori:=2ton do   inc(s[i],s[i-1]);
head:=1;tail:=0;
fori:=1ton do
begin
cons[i]:=b+2*a*s[i];      while(tail>head)and(delhead(i,que[head],que[head+1])) do
inc(head);
j:=que[head];
f[i]:=max(a*sqr(s[i])+b*s[i]+c,f[j]+a*sqr(s[i]-s[j])+b*(s[i]-s[j])+c);
sq[i]:=f[i]+a*sqr(s[i]);      while(tail>head)and(deltail(i,que[tail],que[tail-1])) dodec(tail);      inc(tail);
que[tail]:=i;
end;
writeln(f
);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: