把 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];
}