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: Wrong Answer)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <climits>
#include <iomanip>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    ll n;
    cin >> n;
    vector<pair<ll,ll>> a(n);
    vector<pair<ll,ll>> b(n);
    for(int i = 0;i < n;i++)a[i] = make_pair(0,i),b[i] = make_pair(0,i);
    for(int i = 0;i < n;i++){
        ll in;
        cin >> in;
        a[in - 1].first++;
    }
    for(int i = 0;i < n;i++){
        ll in;
        cin >> in;
        b[in - 1].first++;
    }
  
  
  for(int i = 0;i < n;i++){
    if(a[i].first + b[i].first > n){
      cout << "No" << endl;
      return 0;
    }
  }

  vector<ll> c(n + 1);
  vector<ll> d(n + 1);
  c[0] = 0;
  d[0] = 0;
  for(int i = 1;i < n + 1;i++)c[i] = c[i - 1] + a[i - 1].first/*,cout << c[i] << " "*/;
  //cout << endl;
  for(int i = 1;i < n + 1;i++)d[i] = d[i - 1] + b[i - 1].first/*,cout << d[i] << " "*/;
  //cout << endl;
  
  ll x = 0;
  for(int i = 1;i < n + 1;i++)x = max(x,c[i] - d[i - 1]);
  
  //cout << x << endl;
  
  vector<ll> m;
  for(int i = 0;i < n;i++){
    for(int j = 0;j < (int)b[i].first;j++)m.push_back(i + 1);
  }
  //for(int i = 0;i < (int)m.size();i++)cout << m[i] << endl;
  vector<ll> res;
  for(int i = x;i < n;i++)res.push_back(m[i]);
  for(int i = 0;i < x;i++)res.push_back(m[i]);
  
  cout << "Yes" << endl;
  for(int i = 0;i < n - 1;i++)cout << res[i] << " ";
  cout << res[n - 1] << endl;
}