#include<bits/stdc++.h>
#define rd(x) scanf("%lld",&x)
using namespace std;
typedef long long ll;
const ll N=3e5+5;
ll n,ans,a[N],b[N],h[N];
struct Node{
ll v,id;
}t[N];
bool cmp(Node x,Node y){
return x.v<y.v;
}
int main(){
rd(n);
for(ll i=1;i<=n;i++){
rd(a[i]),t[i].id=i;
if(i>1){
if(a[i-1]<a[i]) t[i-1].v--,t[i].v++;
else t[i-1].v++,t[i].v--;
}
}
for(ll i=1;i<=n;i++) rd(b[i]);
sort(b+1,b+n+1);
sort(t+1,t+n+1,cmp);
for(ll i=1;i<=n;i++) ans+=t[i].v*b[i],h[t[i].id]=i;
printf("%lld\n",ans);ll ans2=0;
for(ll i=1;i<=n;i++) printf("%lld ",b[h[i]]),ans2+=(i>1)*abs(b[h[i]]-b[h[i-1]]);
assert(ans==ans2);
return 0;
}
写了个很离谱的方法,答案倒是算对了,但构造方案有好几个不对