I and OI
Past...
随笔 - 104,  文章 - 2,  评论 - 7

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
      readln(n); 
      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编辑  收藏