最短路 wa on 47 53 球条 呜呜呜
查看原帖
最短路 wa on 47 53 球条 呜呜呜
724136
estimate_error楼主2024/11/18 21:25
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,cnt,ord,s,t;
ll h[100005],d[2005],minn[1005];
bool vis[100005];
vector<ll> cn[1005];
priority_queue<pair<ll,ll> > q;
struct edge{
	ll to,ne,w;
}e[1000005];
struct board{
	ll le,ri,he;
}b[1000005];
void add(ll x,ll y,ll z){
	e[++cnt].to=y;
	e[cnt].w=z;
	e[cnt].ne=h[x];
	h[x]=cnt;
}
void diji(ll p){
	q.push({0,p});
	d[p]=0;
	while(!q.empty()){
		ll u=q.top().second;
		q.pop();
		if(vis[u])
			continue;
		vis[u]=1;
		for(int i=h[u];i;i=e[i].ne){
			ll v=e[i].to;
			if(d[v]>d[u]+e[i].w){
				d[v]=d[u]+e[i].w;
				q.push({-d[v],v});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>s>>t;
	for(int i=1;i<=n;i++)
		cin>>b[i].le>>b[i].ri>>b[i].he; 
	for(int i=1;i<=n;i++){
		add(ord+1,ord+2,b[i].ri-b[i].le);
		add(ord+2,ord+1,b[i].ri-b[i].le);
		ord+=2;
	}
	for(int i=1;i<=n;i++)
		minn[i]=1145141919;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j)
				continue;
			if(b[i].he>b[j].he){
				if(b[j].le<=b[i].le&&b[i].le<=b[j].ri){
					if(b[i].he-b[j].he==minn[i])
						cn[i].push_back(j);
					if(b[i].he-b[j].he<minn[i]){
						minn[i]=b[i].he-b[j].he;
						cn[i].clear();
						cn[i].push_back(j);
					}
				}
				if(b[j].le<=b[i].ri&&b[i].ri<=b[j].ri){
					if(b[i].he-b[j].he==minn[i])
						cn[i].push_back(j);
					if(b[i].he-b[j].he<minn[i]){
						minn[i]=b[i].he-b[j].he;
						cn[i].clear();
						cn[i].push_back(j);
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		ll k=cn[i].size();
		for(int c=0;c<k;c++){
			ll j=cn[i][c];
			if(b[j].le<=b[i].le&&b[i].le<=b[j].ri){
				if(j==t){
					add(i*2-1,j*2-1,b[i].he-b[j].he);
					add(i*2-1,j*2,b[i].he-b[j].he);
				}else{
					add(i*2-1,j*2-1,b[i].le-b[j].le+b[i].he-b[j].he);
					add(i*2-1,j*2,b[j].ri-b[i].le+b[i].he-b[j].he);
				}
			}
			if(b[j].le<=b[i].ri&&b[i].ri<=b[j].ri){
				if(j==t){
					add(i*2,j*2-1,b[i].he-b[j].he);
					add(i*2,j*2,b[i].he-b[j].he);
				}else{
					add(i*2,j*2-1,b[i].ri-b[j].le+b[i].he-b[j].he);
					add(i*2,j*2,b[j].ri-b[i].ri+b[i].he-b[j].he);
				}
			}
		}
	}
	for(int i=1;i<=n*2;i++)
		d[i]=1145141919;
	diji(s*2-1);
//	for(int i=1;i<=n*2;i++)
//		cout<<d[i]<<" ";
	if(d[2*t]==1145141919)
		cout<<-1<<"\n";
	else
		cout<<min(d[2*t],d[2*t-1])<<"\n";
	return 0;
}

2024/11/18 21:25
加载中...