Problem:
Score : 600 points

Problem Statement

Given are two sequences A and B, both of length N.
A and B are each sorted in the ascending order.
Check if it is possible to reorder the terms of B so that for each i (1 \leq i \leq N) A_i \neq B_i holds, and if it is possible, output any of the reorderings that achieve it.

Constraints

1\leq N \leq 2 \times 10^5

1\leq A_i,B_i \leq N

A and B are each sorted in the ascending order.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \cdots A_N
B_1 B_2 \cdots B_N

Output

If there exist no reorderings that satisfy the condition, print No.

If there exists a reordering that satisfies the condition, print Yes on the first line.
After that, print a reordering of B on the second line, separating terms with a whitespace.

If there are multiple reorderings that satisfy the condition, you can print any of them.

Sample Input 1

6
1 1 1 2 2 3
1 1 1 2 2 3

Sample Output 1

Yes
2 2 3 1 1 1

Sample Input 2

3
1 1 2
1 1 3

Sample Output 2

No

Sample Input 3

4
1 1 2 3
1 2 3 3

Sample Output 3

Yes
3 3 1 2

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include<iostream>
#include<iomanip>
#include<cassert>
#include<math.h>
#include<complex>
#include<algorithm>
#include<utility>
#include<queue>
#include<string.h>
#include<string>
#include<set>
#include<map>
#include<unordered_map>
#include<functional>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const ll INF=2e18;
const ll MOD=1e9+7;

ll N;
ll A[200010],B[200010];
ll cntA[200010],cntB[200010];
int main(){
    cin>>N;
    for(ll i=0;i<N;i++) cin>>A[i];
    for(ll i=N-1;i>=0;i--) cin>>B[i];

    for(ll i=0;i<N;i++){
        cntA[A[i]]++; cntB[B[i]]++;
    }
    for(ll i=0;i<N;i++){
        if(A[i]==B[i]){
            if(cntA[A[i]]+cntB[B[i]]>N){
                cout<<"No"<<endl;
                return 0;
            }
            ll bs=i;
            while(B[bs]==A[i])bs++;
            ll as=i;
            while(A[as]==A[i])as++;
            ll start=max(as,bs);

            ll e=i;
            while(A[e]==B[e])e++;

            ll index=i;
            if(A[i-1]==A[i]){
                for(ll j=0;A[j]!=A[i] && index<e;j++){
                    swap(B[j],B[index]);
                    index++;
                }
            }else{
                for(ll j=0;B[j]!=A[i] && index<e;j++){
                    swap(B[j],B[index]);
                    index++;
                }
            }
            for(ll j=start;A[index]==A[i];j++){
                swap(B[j],B[index]);
                index++;
            }
            break;
        }
    }
    cout<<"Yes"<<endl;
    for(ll i=0;i<N;i++) cout<<B[i]<<" ";
    cout<<endl;
    return 0;

    return 0;
}