70pts求助
查看原帖
70pts求助
1030767
XYZYXYZ楼主2024/8/18 11:37
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int maxl=1e5+10,INF=1e9+7;
struct ball{
	int h,l,r,id;
}a[maxl],c[maxl];
struct lisan{
	int val,id;
}b[maxl];
struct node{
	int l,r,data,tag;
}tree[8*maxl];
int n,hh,sx,sy,cnt,vis[maxl],pre[maxl][3],dp[maxl][3];
int cmp1(lisan a,lisan b){
	return a.val<b.val;
}
int cmp2(ball a,ball b){
	return a.h<b.h;
}
void pushdown(int p,int ls,int rs){
	if(tree[p].tag){
		tree[ls].data=tree[p].tag;
		tree[rs].data=tree[p].tag;
		tree[ls].tag=tree[p].tag;
		tree[rs].tag=tree[p].tag;
		tree[p].tag=0;
	}
}
void build_tree(int p,int ld,int rd){
	tree[p]={ld,rd,0,0};
	if(ld==rd){
		tree[p].data=0;
		return;
	}
	int mid=ld+rd>>1;
	int ls=p<<1,rs=p<<1|1;
	build_tree(ls,ld,mid);
	build_tree(rs,mid+1,rd);
}
void update(int p,int ql,int qr,int k){
	if(ql<=tree[p].l&&qr>=tree[p].r){
		tree[p].data=k;
		tree[p].tag=k;
		return;
	}
	int mid=tree[p].l+tree[p].r>>1;
	int ls=p<<1,rs=p<<1|1;
	pushdown(p,ls,rs);
	if(ql<=mid)update(ls,ql,qr,k);
	if(qr>mid)update(rs,ql,qr,k);
}
int query(int p,int x){
	if(tree[p].l==tree[p].r)return tree[p].data;
	int mid=tree[p].l+tree[p].r>>1;
	int ls=p<<1,rs=p<<1|1;
	pushdown(p,ls,rs);
	int res=0;
	if(x<=mid)return query(ls,x);
	if(x>mid)return query(rs,x);
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 
	cin>>n>>hh>>sx>>sy;
	memset(dp,INF,sizeof(dp));
	for(int i=1;i<=n;i++){
		cin>>a[i].h>>a[i].l>>a[i].r;
		c[i].h=a[i].h;
		c[i].l=a[i].l;
		c[i].r=a[i].r;
		a[i].id=i;
		b[cnt+1].id=b[cnt+2].id=i;
		b[++cnt].val=a[i].l;
		b[++cnt].val=a[i].r;
	}
	a[n+1].id=n+1;
	c[n+1].h=a[n+1].h=sy;
	c[n+1].l=c[n+1].r=a[n+1].l=a[n+1].r=sx;
	b[cnt+1].id=n+1;
	b[++cnt].val=sx;
	sort(b+1,b+1+cnt,cmp1);
	int idx;
	for(int i=1;i<=cnt;i++){
		idx=i;
		if(!vis[b[i].id]){
			a[b[i].id].l=idx;
			if(b[i].id==n+1)a[b[i].id].r=idx;
			vis[b[i].id]=1;
		}
		else a[b[i].id].r=idx;
	} 
	sort(a+1,a+1+n,cmp2);
	build_tree(1,1,cnt);
	for(int i=1;i<=n+1;i++){
		pre[i][0]=query(1,a[i].l);
		pre[i][1]=query(1,a[i].r);
		update(1,a[i].l,a[i].r,i);
	}
	int flag=0;
	for(int i=n+1;i>=1;i--){
		if(a[i].id!=n+1&&flag==0)continue;
		else flag=1;
		if(a[i].id==n+1)dp[i][0]=dp[i][1]=0;
		if(a[i].h-a[pre[i][0]].h<=hh){
			int idx1=a[i].id,idx2=a[pre[i][0]].id;
			if(pre[i][0]==0)c[idx2].l=c[idx2].r=c[idx1].l;
			dp[pre[i][0]][0]=min(dp[pre[i][0]][0],dp[i][0]+abs(c[idx1].l-c[idx2].l));
			dp[pre[i][0]][1]=min(dp[pre[i][0]][1],dp[i][0]+abs(c[idx1].l-c[idx2].r));
		}
		if(a[i].h-a[pre[i][1]].h<=hh){
			int idx1=a[i].id,idx2=a[pre[i][1]].id;
			if(pre[i][1]==0)c[idx2].l=c[idx2].r=c[idx1].r;
			dp[pre[i][1]][0]=min(dp[pre[i][1]][0],dp[i][1]+abs(c[idx1].r-c[idx2].l));
			dp[pre[i][1]][1]=min(dp[pre[i][1]][1],dp[i][1]+abs(c[idx1].r-c[idx2].r));
		}
	} 
	cout<<min(dp[0][0],dp[0][1])+sy<<'\n';
	return 0; 
} 
2024/8/18 11:37
加载中...