#include <bits/stdc++.h>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
using namespace std;

typedef long long ll;
typedef unsigned long long llu;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<int, pii> piii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<string, int> psi;
typedef pair<char, int> pci;
typedef pair<int, char> pic;
const int MOD = 1e9 + 7;
const long double PI = 3.141592653589793238462643383279502884197;

ll fac[1] = {1}, inv[1] = {1};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll mp(ll a,ll b){ll ret=1;while(b){if(b&1)ret=ret*a%MOD;a=a*a%MOD;b>>=1;}return ret;}
ll cmb(ll r, ll c) {return (c>r||c<0) ? 0:fac[r] * inv[c] % MOD * inv[r - c] % MOD;}

// 2개가 서로 다른 순열인데...
// a에서 가장 많은 원소가 있고, 마찬가지로 b에서도 있고.
// 서로 다르게...
// 서로 가장 많은 것 순서대로 정렬해서.
// 그 두개끼리 잘 소거시키기..


int isv(multimap<int, int>::iterator kk, multimap<int, int> &mm, int arr[]) {
    if (kk->first != arr[kk->second]) {
        pii t = {arr[kk->second], kk->second};
        mm.erase(kk);

        if (t.first) mm.insert(t);
        return 1;
    }
    return 0;
}

pii ans[200000];
int a[200000];
int b[200000];
vector<int> v[200001];
int cq[200001];
int ca[200001];
int cb[200001];
multimap<int, int> aa, bb, cc;

int main() {
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) scanf("%d", &a[i]), v[a[i]].push_back(i), ca[a[i]]++, cq[a[i]]++;
    for (int i = 0; i < n; i++) scanf("%d", &b[i]), cb[b[i]]++, cq[b[i]]++;

    for (int i = 1; i <= n; i++) {
        if (ca[i]) aa.insert({ca[i], i});
        if (cb[i]) bb.insert({cb[i], i});
        if (cq[i]) cc.insert({cq[i], i});
    }

    for (int cnt = 0; cnt < n; cnt++) {
        auto kk = --cc.end();

        if (isv(kk, cc, cq)) {
            cnt--;
            continue;
        }

        auto kb = --bb.end();
        if (isv(kb, bb, cb)) {
            cnt--;
            continue;
        }

        auto ka = --aa.end();
        if (isv(ka, aa, ca)) {
            cnt--;
            continue;
        }

        if (ca[kk->second] >= cb[kk->second]) {
            if (kb->second == kk->second) {
                if (kb == bb.begin()) return !printf("No\n");
                kb--;
                if (isv(kb, bb, cb)) {
                    cnt--;
                    continue;
                }
            }
            cq[kk->second]--;
            ca[kk->second]--;

            cq[kb->second]--;
            cb[kb->second]--;
            // printf("%d:%d / %d:%d:%d\n", kk->second, ca[kk->second], kb->second, cb[kb->second], kb->first);
            ans[cnt] = {kk->second, kb->second};

        }
        else {
            if (ka->second == kk->second) {
                if (ka == aa.begin()) return !printf("No\n");
                ka--;
                if (isv(ka, aa, ca)) {
                    cnt--;
                    continue;
                }
            }

            cq[kk->second]--;
            cb[kk->second]--;

            cq[ka->second]--;
            ca[ka->second]--;
            ans[cnt] = {ka->second, kk->second};
        }
    }

    for (int i = 0; i < n; i++) {
        pii t = ans[i];
        // ("%d / %d\n", t.first, t.second);
        b[v[t.first].back()] = t.second;
        v[t.first].pop_back();
    }

    /*
    for (int i = 0; i < n; i++) {
        auto ka = --aa.end();
        auto kb = --bb.end();

        // a가 많으니까 b에서 대신할 것을 찾는다.
        if (ka->second == kb->second) {
            if (kb == bb.begin()) return !printf("No\n");
            kb--;
        }

        b[v[ka->second].back()] = kb->second;
        v[ka->second].pop_back();

        pii kq = *ka;
        pii kw = *kb;
        aa.erase(ka); bb.erase(kb);
        kq.first--; kw.first--;
        if (kq.first) aa.insert(kq);
        if (kw.first) bb.insert(kw);
    }
     */

    printf("Yes\n");
    for (int i = 0; i < n; i++) printf("%d ", b[i]);
}


// author: rdd6584


Measured memory_bytes: 48236