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>
#define DEBUG if(0)
#define lli long long int
#define ldouble long double
using namespace std;

const int maxN = 2e5; int n;
int a[maxN], b[maxN];
int ans[maxN];

int main()
{
  while (scanf("%d", &n) != EOF)
  {
    for (int i = 0; i < n; i++)
      scanf("%d", &a[i]);
    for (int i = 0; i < n; i++)
      scanf("%d", &b[i]);

    deque<int> q;
    multiset<int> lol;
    for (int i = n - 1; i >= 0; i--)
      q.push_back(b[i]), lol.insert(b[i]);

    bool can = true;
    for (int i = n - 1; i >= 0; i--)
    {
      if (*lol.begin() != a[i])
      {
        ans[i] = *lol.begin();
        lol.erase(lol.find(ans[i]));
      }
      else if (*lol.rbegin() != a[i])
      {
        ans[i] = *lol.rbegin();
        lol.erase(lol.find(ans[i]));
      }
      else if (lol.lower_bound(a[i] + 1) != lol.end())
      {
        ans[i] = *lol.lower_bound(a[i] + 1);
        lol.erase(lol.find(ans[i]));
      }
      else
        can = false;
    }

    printf("%s\n", can ? "Yes" : "No");
    if (can)
      for (int i = 0; i < n; i++)
        printf("%d%c", ans[i], i < n - 1 ? ' ' : '\n');
  }
  return 0;
}