可以发现答案只与拐点有关,所以贪心就行了,最后把中间的点放进去。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=300005;
int n;
int num[N],ss[N],ans[N];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='0') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int main()
{
n=read();
for (int i=1;i<=n;i++) ss[i]=read();
for (int i=1;i<=n;i++) num[i]=read();
sort(num+1,num+n+1);
int l=1,r=n;
for (int i=2;i<n;i++)
{
if (ss[i]>ss[i-1]&&ss[i]>ss[i+1]) ans[i]=num[r--];
if (ss[i]<ss[i-1]&&ss[i]<ss[i+1]) ans[i]=num[l++];
}
if (ss[1]<ss[2]) ans[1]=num[l++]; else ans[1]=num[r--];
if (ss[n-1]<ss[n]) ans[n]=num[r--]; else ans[n]=num[l++];
for (int i=2;i<n;i++)
{
if (ss[i]>ss[i-1]&&ss[i]<ss[i+1]) ans[i]=num[l++];
if (ss[i]<ss[i-1]&&ss[i]>ss[i+1]) ans[i]=num[r--];
}
long long sum=0;
for (int i=1;i<n;i++) sum+=abs(ans[i]-ans[i+1]);
printf("%lld\n",sum);
for (int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}