思路:
对于每个位置,维护其左边以区间长度为 len 的最小值。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
struct asd{
int Left, Right;
LL cos;
}q[N];
int n, x;
vector<asd>a[N], b[N];
LL num[N];
int main(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
scanf("%d%d%I64d",&q[i].Left, &q[i].Right, &q[i].cos);
a[q[i].Left].push_back(q[i]);
b[q[i].Right].push_back(q[i]);
}
for(int i=1;i<=200000;i++) num[i] = 1e18;
LL ans = 1e18;
for(int i=1;i<=200000;i++){
int sz = a[i].size();
int len;
for(int j=0;j<sz;j++){
len = a[i][j].Right - a[i][j].Left + 1;
if(x > len){
len = x - len;
if(num[len] != 1e18) ans = min(ans, num[len] + a[i][j].cos);
}
}
sz = b[i].size();
for(int j=0;j<sz;j++){
len = b[i][j].Right - b[i][j].Left + 1;
num[len] = min(num[len], b[i][j].cos);
}
}
if(ans == 1e18) puts("-1");
else printf("%I64d\n", ans);
return 0;
}