1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| int n,A[N]; struct SegFinder{ vector <Pii> V[N]; int s[N<<2]; void Build(int p,int l,int r){ if(l==r) { sort(V[l].begin(),V[l].end()); s[p]=V[l].empty()?0:V[l].back().first; return; } int mid=(l+r)>>1; Build(p<<1,l,mid),Build(p<<1|1,mid+1,r); s[p]=max(s[p<<1],s[p<<1|1]); } void Get(int p,int l,int r,int ql,int qr,int x,vector <Pii> &Res){ if(s[p]<x) return; if(l==r) { while(!V[l].empty() && V[l].back().first>=x) Res.pb(mp(l,V[l].back().second)),V[l].pop_back(); s[p]=V[l].empty()?0:V[l].back().first; return; } int mid=(l+r)>>1; if(ql<=mid) Get(p<<1,l,mid,ql,qr,x,Res); if(qr>mid) Get(p<<1|1,mid+1,r,ql,qr,x,Res); s[p]=max(s[p<<1],s[p<<1|1]); } } Finder;
int ls[N],rs[N],stk[N],top,mk[N]; int rt[N]; ll dp[N],s[N<<2],t[N<<2]; ll Que(int p,int l,int r,int ql,int qr){ if(ql<=l && r<=qr) return s[p]; int mid=(l+r)>>1; ll res=1e18; if(ql<=mid) cmin(res,Que(p<<1,l,mid,ql,qr)); if(qr>mid) cmin(res,Que(p<<1|1,mid+1,r,ql,qr)); return res+t[p]; }
void Upd(int p,int l,int r,int ql,int qr,ll x){ if(ql<=l && r<=qr) { s[p]+=x,t[p]+=x; return; } int mid=(l+r)>>1; if(ql<=mid) Upd(p<<1,l,mid,ql,qr,x); if(qr>mid) Upd(p<<1|1,mid+1,r,ql,qr,x); s[p]=min(s[p<<1],s[p<<1|1])+t[p]; }
void Solve(int p,int l,int r){ vector <Pii> V; Finder.Get(1,1,n,l,r,A[p]+1,V);
if(l<p) Solve(ls[p],l,p-1); if(p<r) Solve(rs[p],p+1,r); if(rs[p]) Upd(1,1,n,l,p,dp[rs[p]]); if(ls[p]) Upd(1,1,n,p,r,dp[ls[p]]); ll sum=0; for(Pii i:V) sum+=i.second; if(sum) Upd(1,1,n,l,r,sum); dp[p]=Que(1,1,n,l,r); for(Pii i:V) cmin(dp[p],Que(1,1,n,i.first,i.first)-i.second); }
int main(){ n=rd(); rep(i,1,n) { A[i]=rd(); while(top && A[stk[top]]<=A[i]) ls[i]=stk[top--]; stk[++top]=i; } top=0; drep(i,n,1) { while(top && A[stk[top]]<A[i]) rs[i]=stk[top--]; stk[++top]=i; } rep(i,1,n) mk[ls[i]]=mk[rs[i]]=1; rep(_,1,rd()) { int x=rd(),y=rd(),c=rd(); Finder.V[x].pb(mp(y,c)); } Finder.Build(1,1,n); rep(i,1,n) if(!mk[i]) { Solve(i,1,n); printf("%lld\n",dp[i]); return 0; } }
|