I and OI Past...

CEOI2004Two的加强版.

code:

/**************************************************************
Problem: 1096
User: exponent
Language: Pascal
Result: Accepted
Time:6220 ms
Memory:51008 kb
****************************************************************/

const oo=1e100;
maxn=1000001;
var   f,x,p,c,sum,cost:array[0..maxn] of int64;
q:array[0..maxn] of longint;
n,i,h,t:longint;

function calc(j,i:longint):int64;
begin
calc:=cost[i]-cost[j]-sum[j]*(x[i]-x[j]);
end;

function slope(j,k:longint):extended;
var   tmp:int64;
begin
tmp:=f[k]-f[j]-cost[k]+cost[j]+sum[k]*x[k]-sum[j]*x[j];
if sum[k]=sum[j] then
if tmp>=0 then exit(oo)
else exit(-oo);
slope:=tmp/(sum[k]-sum[j]);
end;

begin
for i:=1 to n do readln(x[i],p[i],c[i]);

for i:=1 to n do sum[i]:=sum[i-1]+p[i];

for i:=1 to n do
cost[i]:=cost[i-1]+sum[i-1]*(x[i]-x[i-1]);

for i:=1 to n do
begin
while (h<t)and(slope(q[h],q[h+1])<x[i]) do inc(h);
f[i]:=f[q[h]]+calc(q[h],i)+c[i];
while (h<t)and(slope(q[t-1],q[t])>slope(q[t],i)) do dec(t);
inc(t); q[t]:=i;
end;
writeln(f[n]);
end.

posted on 2011-08-13 16:41  exponent  阅读(307)  评论(0编辑  收藏