1 (* 2 *Problem: NOI2008 自愿者招募 3 *Author : Chen Yang 4 *Time : 2012.5.18 5 *State : AC 6 *Memo : 网络流 7 *) 8 program employee; 9 uses math; 10 const max=100000000; 11 maxn=2020; 12 type 13 ty1=^ty2; 14 ty2=record 15 x,f,v,fa:longint; 16 next,up:ty1; 17 end; 18 19 var 20 n,m,s,t,flow,tot,ans:longint; 21 first,fa:array[0..maxn] of ty1; 22 dui,dis,mflow:array[0..maxn] of longint; 23 get:array[0..maxn] of boolean; 24 //================== 25 procedure insert(x,y,f,v:longint); inline; 26 var 27 p,q:ty1; 28 begin 29 new(p); 30 p^.x:=y; p^.f:=f; p^.v:=v; p^.fa:=x; 31 p^.next:=first[x]; first[x]:=p; 32 new(q); 33 q^.x:=x; q^.f:=0; q^.v:=-v; q^.fa:=y; 34 q^.next:=first[y]; first[y]:=q; 35 p^.up:=q; q^.up:=p; 36 end; 37 //================== 38 procedure built; 39 var 40 i,x,y,z:longint; 41 begin 42 read(n,m); 43 s:=0; t:=n+2; y:=0; 44 for i:=1 to n do 45 begin 46 read(x); 47 if x-y>0 then begin insert(s,i,x-y,0); inc(tot,x-y); end 48 else if x-y<0 then insert(i,t,y-x,0); 49 y:=x; 50 insert(i+1,i,max,0); 51 end; 52 insert(n+1,t,x,0); 53 for i:=1 to m do 54 begin 55 read(x,y,z); 56 insert(x,y+1,max,z); 57 end; 58 end; 59 //================== 60 procedure spfa; 61 var 62 l,r,x:longint; 63 p:ty1; 64 begin 65 fillchar(get,sizeof(get),false); 66 fillchar(dis,sizeof(dis),$7); 67 fillchar(mflow,sizeof(mflow),$7); 68 l:=0; r:=1; dui[1]:=s; dis[s]:=0; 69 while l<>r do 70 begin 71 inc(l); if l>maxn then l:=0; 72 x:=dui[l]; get[x]:=false; 73 p:=first[x]; 74 while p<>nil do 75 begin 76 if (p^.f>0) and (dis[p^.x]>dis[x]+p^.v) then 77 begin 78 dis[p^.x]:=dis[x]+p^.v; mflow[p^.x]:=min(mflow[x],p^.f); 79 fa[p^.x]:=p; 80 if not get[p^.x] then 81 begin 82 get[p^.x]:=true; 83 inc(r); if r>maxn then r:=0; 84 dui[r]:=p^.x; 85 end; 86 end; 87 p:=p^.next; 88 end; 89 end; 90 inc(flow,mflow[t]); inc(ans,mflow[t]*dis[t]); 91 p:=fa[t]; 92 while p<>nil do 93 begin 94 dec(p^.f,mflow[t]); 95 inc(p^.up^.f,mflow[t]); 96 p:=fa[p^.fa]; 97 end; 98 end; 99 //================== 100 begin 101 assign(input,'employee.in'); reset(input); 102 assign(output,'employee.out'); rewrite(output); 103 built; 104 while flow<tot do spfa; 105 writeln(ans); 106 close(input); close(output); 107 end.