写的比较复杂
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,a[N],b[N],tp[N],dw[N],n1,n2,ans[N];
int istp,isdw;
bool use[N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(b+1,b+1+n);
if(a[1]<a[2]) dw[++n2]=1,isdw++;
else tp[++n1]=1,istp++;
for(int i=2;i<n;i++){
if(a[i-1]<a[i]&&a[i]>a[i+1]) tp[++n1]=i;
if(a[i-1]>a[i]&&a[i]<a[i+1]) dw[++n2]=i;
}
if(a[n-1]<a[n]) tp[++n1]=n,istp++;
else dw[++n2]=n,isdw++;
int r=n,l=1;
for(int i=1;i<=n;i++){
if(i==1){
if(a[1]>a[2]) ans[1]=b[n-n1+1];
if(a[1]<a[2]) ans[1]=b[n2];
continue;
}
if(i==n){
if(a[n-1]>a[n]&&isdw==1) ans[n]=b[n2];
if(a[n-1]>a[n]&&isdw==2) ans[n]=b[n2-1];
if(a[n-1]<a[n]&&istp==1) ans[n]=b[n-n1+1];
if(a[n-1]<a[n]&&istp==2) ans[n]=b[n-n1];
continue;
}
if(a[i-1]<a[i]&&a[i]>a[i+1]) ans[i]=b[r--];
if(a[i-1]>a[i]&&a[i]<a[i+1]) ans[i]=b[l++];
}
//记录极值
for(int i=2;i<n;){
if(!ans[i]){
int l=i-1,r=i+1;
while(!ans[r]) r++;
while(!ans[l]) l--;
int minn,maxn;
maxn=ans[l],minn=ans[r];
if(minn>maxn) swap(minn,maxn);
bool s=0;
if(ans[l]<ans[r]) s=1;
int st;
if(s){
for(int k=n1+1;k<=n-n2;k++)
if(!use[k]&&minn<b[k]&&b[k]<maxn){
st=k;
break;
}
for(int k=1;k<=r-l-1;k++)
ans[l+k]=b[st+k-1],use[st+k-1]=1;
i=r+1;
}
if(!s){
for(int k=n-n2;k>=n1+1;k--)
if(!use[k]&&minn<b[k]&&b[k]<maxn){
st=k;
break;
}
for(int k=1;k<=r-l-1;k++)
ans[l+k]=b[st-k+1],use[st-k+1]=1;
i=r+1;
}
}
}
//往里面填值
int sum=0;
for(int i=2;i<=n;i++) sum+=abs(ans[i]-ans[i-1]);
cout<<sum<<'\n';
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}