QBTICKET - Mua vé tàu hoả

Tác giả: RR

Ngôn ngữ: Pascal

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=100111;
  oo=1000000000000000001;
var
  f1,f2:text;
  n,l1,l2,l3,c1,c2,c3,s,t,start,target:int64;
  vt,ind:array[1..MAXN] of int64;
  d:array[1..MAXN] of int64;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
procedure inp;
var
  i:longint;
begin
  read(f1,l1,l2,l3,c1,c2,c3);
  read(f1,n);
  read(f1,s,t);
  for i:=2 to n do read(f1,vt[i]);
  for i:=1 to n do ind[i]:=i;
end;
procedure swap(var a,b:int64);
var
  temp:int64;
begin
  temp:=a; a:=b; b:=temp;
end;
procedure sort(l,r:int64);
var
  i,j,mid:int64;
begin
  i:=l; j:=r; mid:=vt[l+random(r-l+1)];
  repeat
    while vt[i]<mid do inc(i);
    while vt[j]>mid do dec(j);
    if i<=j then
      begin
        swap(vt[i],vt[j]);
        swap(ind[i],ind[j]);
        inc(i); dec(j);
      end;
  until i>j;
  if i<r then sort(i,r);
  if l<j then sort(l,j);
end;
procedure solve;
var
  i1,i2,i3:int64;
  i:longint;
begin
//  for i:=2 to n do if ind[i]=s then start:=i;
//  for i:=2 to n do if ind[i]=t then target:=i;
  start:=s; target:=t;
  if start>target then swap(start,target);
  d[start]:=0; i1:=start; i2:=start; i3:=start;
  for i:=1+start to target do
    begin
      d[i]:=oo;
      //Cap nhat theo loai 1
      while (vt[i]-vt[i1]>l1) do inc(i1);
      d[i]:=min(d[i],d[i1]+c1);
      //Cap nhat theo loai 2
      while (vt[i]-vt[i2]>l2) do inc(i2);
      d[i]:=min(d[i],d[i2]+c2);
      //Cap nhat theo loai 3
      while (vt[i]-vt[i3]>l3) do inc(i3);
      d[i]:=min(d[i],d[i3]+c3);
    end;
end;
procedure ans;
begin
  writeln(f2,d[target]);
end;
begin
  openF;
  inp;
//  sort(1,n);
  solve;
  ans;
  closeF;
end.

Download