#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N][4],p[2*N+5],n,h,x,y,cnt;
map<int,int>mp;
struct tree{
int d[N];
inline void build(int s,int t,int p){
if(s==t){return ;}int m=s+((t-s)>>1);
build(s,m,p*2),build(m+1,t,p*2+1);
d[p]=(d[p*2]==d[p*2+1])?d[p*2]:-1;
}
inline void update(int l,int r,int c,int s,int t,int p){
if(l<=s&&t<=r){d[p]=c;return ;}int m=s+((t-s)>>1);
if(l<=m)update(l,r,c,s,m,p*2);
if(m<r) update(l,r,c,m+1,t,p*2+1);
d[p]=(d[p*2]==d[p*2+1])?d[p*2]:-1;
}
inline int query(int x,int s,int t,int p){
if(d[p]!=-1)return d[p];
if(s==t)return d[p];
int m=s+((t-s)>>1);
if(x<=m)return query(x,s,m,p*2);
else return query(x,m+1,t,p*2+1);
}
}T;
struct tip{int h,l,r,l1,r1;}a[N];
bool cmp(tip a,tip b){return a.h<b.h;}
int main(){
cin>>n>>h>>x>>y;
for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].h,&a[i].l,&a[i].r);
for(int i=1;i<=n;i++)p[i]=a[i].l,p[i+n]=a[i].r;
p[2*n+1]=x,p[2*n+2]=y;
sort(p+1,p+1+2*n+2);int len=unique(p+1,p+1+2*n+2)-p-1;
for(int i=1;i<=len;i++)mp[p[i]]=++cnt;
T.build(1,cnt,1);x=mp[x],y=mp[y];
for(int i=1;i<=n;i++)a[i].l1=mp[a[i].l],a[i].r1=mp[a[i].r];
sort(a+1,a+1+n,cmp);a[0].h=0,a[0].l=a[0].l1=1,a[0].r=a[0].r1=cnt;
memset(f,0x3f,sizeof(f));f[0][1]=0,f[0][2]=0;
// for(int i=1;i<=n;i++)printf("%d = h:%d l:%d r:%d l1:%d r1:%d\n",i,a[i].h,a[i].l,a[i].r,a[i].l1,a[i].r1);
for(int i=1;i<=n;i++){
int x1=T.query(a[i].l1,1,cnt,1),x2=T.query(a[i].r1,1,cnt,1);
if(a[i].h-a[x1].h<=h)f[i][1]=min(f[x1][1]+abs(a[i].l-a[x1].l),f[x1][2]+abs(a[i].l-a[x1].r))+a[i].h-a[x1].h;
if(a[i].h-a[x2].h<=h)f[i][2]=min(f[x2][1]+abs(a[i].r-a[x2].l),f[x2][2]+abs(a[i].r-a[x2].r))+a[i].h-a[x2].h;
T.update(a[i].l1,a[i].r1,i,1,cnt,1);
// for(int j=1;j<=cnt;j++)printf("%3d",T.query(j,1,cnt,1));
// printf("\n");
}
int k=T.query(x,1,cnt,1);
printf("%d",min(f[k][1]+abs(a[k].l1-x),f[k][2]+abs(a[k].r1-x))+y-a[k].h);
return 0;
}
没过样例2(自己觉得应该是线段树的问题)
求调