用线段树维护就好,每次更新取最优
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int inf=1<<29; const int maxn=1e4+100; const int maxm=1e5; struct Node { int t1; int t2; int c; Node(){} Node(int st1,int st2,int sc):t1(st1),t2(st2),c(sc){} bool operator < (const Node &a)const { if(t1==a.t1) return t2<a.t2; return t1<a.t1; } }a[maxn]; struct Tree { int l; int r; int val; int update; }t[maxm*4]; int n,m,e,cnt; void Build(int l,int r,int index) { t[index].l=l; t[index].r=r; t[index].val=inf; t[index].update=inf; if(l==r) return; int mid=(t[index].l+t[index].r)>>1; Build(l,mid,index<<1); Build(mid+1,r,index<<1|1); } void PushDown(int index) { if(t[index].l==t[index].r) return; if(t[index].update!=inf) { t[index<<1].val=min(t[index<<1].val,t[index].update); t[index<<1|1].val=min(t[index<<1|1].val,t[index].update); t[index<<1].update=min(t[index<<1].update,t[index].update); t[index<<1|1].update=min(t[index<<1|1].update,t[index].update); t[index].update=inf; } } void PushUp(int index) { t[index].val=min(t[index<<1].val,t[index<<1|1].val); } int Query(int l,int r,int index) { PushDown(index); if(t[index].l==l&&t[index].r==r) return t[index].val; int mid=(t[index].l+t[index].r)>>1; int ans; if(r<=mid) return Query(l,r,index<<1); else if(l>mid) return Query(l,r,index<<1|1); return min(Query(l,mid,index<<1),Query(mid+1,r,index<<1|1)); } void Update(int l,int r,int index,int val) { PushDown(index); if(t[index].l==l&&t[index].r==r) { t[index].val=min(t[index].val,val); t[index].update=min(t[index].update,val); return; } int mid=(t[index].l+t[index].r)>>1; if(r<=mid) Update(l,r,index<<1,val); else if(l>mid) Update(l,r,index<<1|1,val); else { Update(l,mid,index<<1,val); Update(mid+1,r,index<<1|1,val); } PushUp(index); } int main() { while(scanf("%d%d%d",&n,&m,&e)!=EOF) { cnt=0; e-=m; Build(0,e,1); for(int i=0;i<n;i++) { int t1,t2,c; scanf("%d%d%d",&t1,&t2,&c); if(t2<m) continue; t1-=m; t1=max(t1,0); t2-=m; t2=max(t2,0); t2=min(t2,e); a[cnt++]=Node(t1,t2,c); } sort(a,a+cnt); bool is=true; for(int i=0;i<cnt;i++) { if(a[i].t1==0) Update(a[i].t1,a[i].t2,1,a[i].c); else { int val=Query(a[i].t1-1,a[i].t2-1,1); if(val==inf) { is=false; break; } Update(a[i].t1,a[i].t2,1,val+a[i].c); } } if(!is) printf("-1\n"); else printf("%d\n",Query(e,e,1)); } return 0; }