Language: C++

/*input
10
1 1 5 1 4 5 5 4 9 4 
1 4 9 9 8 2 1 8 2 1
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
//order_of_key #of elements less than x
// find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll,ll>
#define f first
#define s second
#define pb push_back
#define REP(i,n) for(ll i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define FILL(n,x) memset(n,x,sizeof(n))
#define ALL(_a) _a.begin(),_a.end()
#define sz(x) (int)x.size()
const ll maxn=2e5+5;
const ll maxlg=__lg(maxn)+2;
const ll INF64=4e18;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7;
const ld PI=3.14159265358979323846;
const ld eps=1e-9;
#define lowb(x) x&(-x)
#define MNTO(x,y) x=min(x,(__typeof__(x))y)
#define MXTO(x,y) x=max(x,(__typeof__(x))y)
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define MP make_pair
ll mult(ll a,ll b){
    return (a*b)%MOD;
}
ll mypow(ll a,ll b){
    ll res=1LL;
    while(b){
        if(b&1) res=res*a%MOD;
        a=a*a%MOD;
        b>>=1;
    }
    return res;
}
int a[maxn],b[maxn],cnt[maxn],cnt2[maxn];
int nxt[maxn];
int lst[maxn];
vector<int> v[maxn];
int main(){
    ios::sync_with_stdio(false),cin.tie(0);
    srand(time(NULL));
    int n;
    cin>>n;
    REP(i,n) cin>>a[i],cnt2[a[i]]++,v[a[i]].pb(i);
    REP1(i,n) v[i].pb(INF);
    REP(i,n){
        cin>>b[i],cnt[b[i]]++;
        //cout<<b[i]<<' ';
    }
    //cout<<'\n';
    //REP(i,n) cout<<a[i]<<' ';
    //cout<<'\n';
    set<pair<pair<pii,int>,int>> s;
    REP1(i,n) if(cnt[i]+cnt2[i]>n){
        cout<<"No\n";
        return 0;
    }
    REP1(i,n) if(cnt[i]) s.insert({{{cnt[i]+cnt2[i],cnt2[i]},-v[i].front()},i});
    REP(i,n){
        auto it=prev(s.end());
        while(it!=s.begin() and (*it).s==a[i]){
            --it;
        }
        s.erase(it);
        if(cnt[(*it).s]>1) s.insert({{{(--cnt[(*it).s])+cnt2[(*it).s],cnt2[(*it).s]},-(*upper_bound(ALL(v[(*it).s]),i))},(*it).s});
        if(s.find({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-i},a[i]})!=s.end()){
            s.erase(s.find({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-i},a[i]}));
            --cnt2[a[i]];a
            s.insert({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-(*upper_bound(ALL(v[(*it).s]),i))},a[i]});
        }
        b[i]=(*it).s;
    }
    REP(i,n){
        if(a[i]==b[i]){
            assert(false);
        }
        //cout<<b[i]<<' ';
    }
    cout<<"Yes\n";
    REP(i,n){
        cout<<b[i]<<' ';
    }
}


Compiler output:
a.cc: In function 'int main()':
a.cc:82:55: warning: narrowing conversion of '- i' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
   82 |         if(s.find({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-i},a[i]})!=s.end()){
      |                                                       ^~
a.cc:83:64: warning: narrowing conversion of '- i' from 'll' {aka 'long long int'} to 'int' [-Wnarrowing]
   83 |             s.erase(s.find({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-i},a[i]}));
      |                                                                ^~
a.cc:84:27: error: expected ';' before 'second'
   84 |             --cnt2[a[i]];a
      |                           ^
      |                           ;
a.cc:85:99: error: expected primary-expression before ')' token
   85 |             s.insert({{{cnt[a[i]]+cnt2[a[i]],cnt2[a[i]]},-(*upper_bound(ALL(v[(*it).s]),i))},a[i]});
      |                                                                                                   ^