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<bits/stdc++.h>

using namespace std;

int main(){
  int N;
  cin >> N;
  
  vector<int> A(N);
  vector<int> B(N);
  vector<int> cntA(N + 1, 0), cntB(N + 1, 0);
  for(int i = 0; i < N; i++){
    cin >> A[i];
    ++cntA[A[i]];
  }
  for(int i = 0; i < N; i++){
    cin >> B[i];
    ++cntB[B[i]];
  }
  
  int mfA = 0, mfB = 0, mxA = 0, mxB = 0;
  for(int i = 0; i <= N; i++){
    if(cntA[i] >= mxA){
      mfA = i;
      mxA = cntA[i];
    }
    if(cntB[i] >= mxB){
      mfB = i;
      mxB = cntB[i];
    }
  }
  
  if(mxA > N / 2 && mxB > N / 2 && mfA == mfB){
    puts("No");
    return 0;
  }
  
  reverse(B.begin(), B.end());
  
  int same = -1;
  int l = -1, r = -2;
  for(int i = 0; i < N; i++){
    if(A[i] == B[i]){
      if(l == -1){
        l = i;
        r = i;
        same = A[i];
      }else r = i;
    }
  }
  
  if(A[0] != same && A[N - 1] != same){
    puts("Yes");
    for(int i = 0; i < r - l + 1; i++) cout << same << ' ';
    for(int i = 0; i < N; i++){
      if(B[i] == same) continue;
      cout << B[i] << ' ';
    }
    cout << endl;
  }else if(A[0] == same && r - l + 1 <= N - r - 1){
    puts("Yes");
    for(int i = 0; i < N; i++){
      if(B[i] == same) continue;
      cout << B[i] << ' ';
    }
    for(int i = 0; i < r - l + 1; i++) cout << same << ' ';
    cout << endl;
  }else if(A[N - 1] == same && r - l + 1 <= l + 1){
    puts("Yes");
    for(int i = 0; i < r - l + 1; i++) cout << same << ' ';
    for(int i = 0; i < N; i++){
      if(B[i] == same) continue;
      cout << B[i] << ' ';
    }
    cout << endl;
  }else{
    puts("No");
  }
  
  return 0;
}