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;

#define eb emplace_back
#define ii pair<int, int>
#define OK (cerr << "OK" << endl)
#define debug(x) cerr << #x " = " << (x) << endl
#define ff first
#define ss second
#define int long long
#define tt tuple<int, int, int>
#define all(x) x.begin(), x.end()
#define vi vector<int>
#define vii vector<pair<int, int>>
#define vvi vector<vector<int>>
#define vvii vector<vector<pair<int, int>>>
#define Mat(n, m, v) vector<vector<int>>(n, vector<int>(m, v))
#define endl '\n'

constexpr int INF = 2e18;
constexpr int MOD = 1e9 + 7;
constexpr int MAXN = 2e5 + 3;

vector<int> a;
bool check(const vector<int> &arr) {
  for (int i = 0; i < arr.size(); ++i) {
    if (arr[i] == a[i]) {
      return false;
    }
  }
  return true;
}

// #define MULTIPLE_TEST_CASES
void solve() {
  clock_t start = clock();
  clock_t end = clock();

  int n;
  cin >> n;

  a.resize(n);
  vector<int> bb(n);
  for (int &x : a)
    cin >> x;
  multiset<int> b;
  for (int &x : bb) {
    cin >> x;
    b.emplace(x);
  }

  bool ok = true;
  vector<int> ans;

  {
    ans.clear();
    for (int x : a) {
      auto it = b.upper_bound(x);
      if (it == b.end()) {
        if (!b.empty() && *b.begin() != x) {
          ans.eb(*b.begin());
          b.erase(b.begin());
        } else {
          ans.clear();
          ok = false;
          break;
        }
      } else {
        ans.eb(*it);
        b.erase(it);
      }
    }
  }

  // if (!ok) {
  //   ok = true;
  //   ans.clear();
  //   for (int x : a) {
  //     if (!b.empty() && b.begin() != x) {
  //       ans.eb(*b.begin());
  //       b.erase(b.begin());
  //       continue;
  //     }
  //     auto it = b.upper_bound(x);
  //     if (it == b.end()) {
  //       if (!b.empty() && *b.begin() != x) {
  //         ans.eb(*b.begin());
  //         b.erase(b.begin());
  //       } else {
  //         ans.clear();
  //         ok = false;
  //         break;
  //       }
  //     } else {
  //       ans.eb(*it);
  //       b.erase(it);
  //     }
  //   }
  // }

  while (double(end - start) / double(CLOCKS_PER_SEC) <= 1.9) {
    random_shuffle(all(bb));
    if (check(bb)) {
      ans = bb;
      ok = true;
      break;
    }
    end = clock();
  }

  if (!ok)
    cout << "No" << endl;
  else {
    cout << "Yes" << endl;
    for (int x : ans) {
      cout << x << ' ';
    }
    cout << endl;
  }
}

signed main() {
  // freopen(".in", "r", stdin);
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);

  int t = 1;
#ifdef MULTIPLE_TEST_CASES
  cin >> t;
#endif
  while (t--)
    solve();
}