唔 思路是 dp
很好想到
f[i]=min(f[j])+a[i].s; a[i].l-1=
#include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 0x3fffffff
using namespace std;
//by mars_ch
int n,m,E;
struct data
{
int f,t,s;
}e[100005];
int f[100005];
struct line
{
int l,r,minn;
}tr[8000005];
bool cmp(data a,data b)
{
if(a.f==b.f)
return a.t<b.t;
return a.f<b.f;
}
void build(int l,int r,int rt)//建树
{
printf("%d %d\n",l,r);
tr[rt].minn=inf;
if(l==r)
return;
int m=(l+r)/2;
build(l,m,rt*2);
build(m+1,r,rt*2+1);
}
void updata(int x,int y,int l,int r,int root)
{
if(l == r)
{
tr[root].minn=min(tr[root].minn,y);
return;
}
int mid=(l+r)>>1;
if(x<=mid)
{
updata(x,y,l,mid,root<<1);
}
else
{
updata(x,y,mid+1,r,root<<1|1);
}
tr[root].minn=min(tr[root<<1].minn,tr[root<<1|1].minn);
}
int query(int l,int r,int L,int R,int root)
{
if(l<=L && r>=R)
{
return tr[root].minn;
}
int res=0x3fffffff;
int mid=(L+R)>>1;
if(l<=mid)
{
res=query(l,r,L,mid,root<<1);
}
if(r>mid)
{
res=min(res,query(l,r,mid+1,R,root<<1|1));
}
return res;
}
int main()
{
scanf("%d%d%d",&n,&m,&E);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&e[i].f,&e[i].t,&e[i].s);
}
sort(e+1,e+n+1,cmp);
build(m-1,E,1);
bool flag=true;
int now=m-1;
updata(m-1,0,m-1,E,1);
for(int i=1;i<=n;i++)
{
if(e[i].f>now+1)
{
flag=false;
break;
}
int minn=query(e[i].f-1,e[i].t,m-1,E,1);
//printf("%d\n",minn);
updata(e[i].t,minn+e[i].s,m-1,E,1);
now=max(now,e[i].t);
}
if(!flag) puts("-1");
else printf("%d\n",query(E,E,m-1,E,1));
}