思路:学到新东西了,用一个sum数组,sum[i]价值为i的最小花费,那么先按l排序,到达r才更新sum数组,具体见码。
# include <bits./stdc++.h>
using namespace std;
const int maxn = 2e5+3;
const int INF = 0x7fffffff;
int sum[maxn];
struct node
{
int l, r, c, v, sta;
node(){};
node(int l, int r, int c, int v, int sta):l(l),r(r),c(c),v(v),sta(sta){}
}a[maxn<<1];
bool cmp(node a, node b)
{
if(a.l == b.l)
return a.sta > b.sta;
else
return a.l < b.l;
}
int main()
{
int n, x, b, c, d, cnt=0, ans = INF;
memset(sum, -1, sizeof(sum));
scanf("%d%d",&n,&x);
for(int i=0; i<n; ++i)
{
scanf("%d%d%d",&b,&c,&d);
a[cnt++] = node(b,c,d,c-b+1,1);
a[cnt++] = node(c,b,d,c-b+1,-1);
}
sort(a, a+cnt,cmp);
for(int i=0; i<cnt; ++i)
{
if(a[i].sta == 1)
{
if(a[i].v < x && sum[x-a[i].v] != -1)
ans = min(ans, a[i].c + sum[x-a[i].v]);
}
else
if(a[i].v < x && (sum[a[i].v]==-1 || sum[a[i].v] > a[i].c))
sum[a[i].v] = a[i].c;
}
printf("%d\n",ans==INF?-1:ans);
return 0;
}