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++ (Clang 10.0.0) (judge verdict: Time Limit Exceeded)

/*
 * @Autor: valk
 * @Date: 2020-04-04 14:56:12
 * @LastEditTime: 2020-09-19 19:46:17
 * @Description: 如果邪恶  是华丽残酷的乐章 它的终场 我会亲手写上 晨曦的光 风干最后一行忧伤 黑色的墨 染上安详
 */

#include <algorithm>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#define emplace_back push_back
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9 + 7;
const int seed = 12289;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;

int arr[N], brr[N];
int num[N], num2[N];
int ans[N];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
        num[arr[i]]++;
    }
    set<int> s;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &brr[i]);
        num2[brr[i]]++;
        s.insert(brr[i]);
    }

    sort(arr + 1, arr + 1 + n);
    int m = unique(arr + 1, arr + 1 + n) - arr - 1;

    set<pair<int, int>> pre;
    vector<pair<int, int>> vec;
    int flag = 1, tot = 1;
    for (int i = 1; i <= m; i++) {
        int cnt = num[arr[i]];
        while (cnt--) {
            auto it = s.end();
            it--;
            if (*it == arr[i]) {
                if (it == s.begin()) {
                    for (auto p : pre) {
                        if (p.first != arr[i]) {
                            vec.pb({ arr[i], p.second });
                            ans[tot] = p.first;
                            ans[p.second] = arr[i];
                            pre.erase(p);
                            break;
                        }
                    }
                } else {
                    --it;
                    ans[tot] = *it;
                    if (!--num2[*it]) {
                        s.erase(it);
                    }
                }
            } else {
                ans[tot] = *it;
                if (!--num2[*it]) {
                    s.erase(it);
                }
            }
            if (ans[tot] != 0) {
                vec.pb({ ans[tot], tot });
            } else {
                flag = 0;
                break;
            }
            tot++;
        }
        for (auto p : vec) {
            pre.insert(p);
        }
    }
    if (!flag) {
        printf("No\n");
        return 0;
    }
    printf("Yes\n");
    for (int i = 1; i <= n; i++) {
        printf("%d ", ans[i]);
    }
    printf("\n");
    return 0;
}