写了一发,发现交不了
查看原帖
写了一发,发现交不了
558877
linjingxiang楼主2025/7/1 10:57

把 luogu 当个保存站吧,以后要是 luogu 能把remote_judge 修好了,再交一下。

#include<bits/stdc++.h>
#define pb push_back
#define N 200005
#define ll long long
using namespace std;
int n,pos1,posn,m;
struct node{
	int a,b,num;
}a[N];
ll dis[N*3];
bool vis[N*3];
struct edge{
	int v,w;
};
vector<edge>t[N*3];
#define pre(i) (i+n)
#define suf(i) (i+2*n)
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i].a,a[i].num=i;
	for(int i=1;i<=n;i++)cin>>a[i].b;
	sort(a+1,a+n+1,[](node x,node y){return x.b<y.b;});
	for(int i=1;i<=n;i++){
		if(i!=1)t[pre(i)].pb({pre(i-1),0});
		if(i!=n)t[suf(i)].pb({suf(i+1),a[i+1].b-a[i].b});
		t[pre(i)].pb({i,a[i].b});
		t[suf(i)].pb({i,0});
		if(a[i].num==1)pos1=i;
		if(a[i].num==n)posn=i;
		if(a[i].a+a[n].b<m){
			t[i].pb({pre(n),a[i].a});
			continue;
		}
		if(a[i].a+a[1].b>=m){
			t[i].pb({suf(1),a[i].a+a[1].b-m});
			continue;
		}
		int p=lower_bound(a+1,a+n+1,m-a[i].a,[](auto x,int y){return x.b<y;})-a;
		t[i].pb({pre(p-1),a[i].a});
		t[i].pb({suf(p),a[i].a+a[p].b-m});
	}
	memset(dis,0x3f,(sizeof dis[0])*(3*n+1));
	dis[pos1]=0;
	priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>q;
	q.push({0,pos1});
	while(q.size()){
		int u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(auto v:t[u])if(!vis[v.v]&&dis[u]+v.w<dis[v.v]){
			dis[v.v]=dis[u]+v.w;
			q.push({dis[v.v],v.v});
		}
	}
	cout<<dis[posn];
}
2025/7/1 10:57
加载中...