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# (.NET Core 3.1.201) (judge verdict: Accepted)

using System.Collections.Generic;
using System.Linq;
using System;

public class P
{
    public int id { get; set; }
    public bool froma { get; set; }
    public int x { get; set; }
}

public class P2
{
    public int x1 { get; set; }
    public int id1 { get; set; }
    public int x2 { get; set; }
    public int id2 { get; set; }
}

public class Hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());

        string[] line = Console.ReadLine().Trim().Split(' ');
        var a = Array.ConvertAll(line, int.Parse);
        line = Console.ReadLine().Trim().Split(' ');
        var b = Array.ConvertAll(line, int.Parse);
        var ps = new P[n * 2];
        var p = 0;
        var d = new Dictionary<int, int>();
        for (int i = 0; i < n; i++)
        {
            ps[p++] = new P { id = i, x = a[i], froma = true };
            ps[p++] = new P { id = i, x = b[i] };
            if (d.ContainsKey(a[i])) d[a[i]]++;
            else d[a[i]] = 1;
            if (d.ContainsKey(b[i])) d[b[i]]++;
            else d[b[i]] = 1;
        }
        var dmax = d.Max(x =>x.Value);
        if (dmax > n) { Console.WriteLine("No"); goto exit; }
        Console.WriteLine("Yes");
        getAns(n, ps);
    exit:;
    }
    static void getAns2 (List<P2 > fa, List<P2 > fb, int[] ans )
    {
        var imax = fa.Count();
        for (int i = 0; i < imax; i++)
        {
            if (fa[i].x1 == fb[i].x1 | fa[i].x2 == fb[i].x2)
            {
                ans[fa[i].id1] = fb[i].x2;
                ans[fa[i].id2] = fb[i].x1;
            }
            else
            {
                ans[fa[i].id1] = fb[i].x1;
                ans[fa[i].id2] = fb[i].x2;
            }
        }
    }
    static void getAns (int n, P[] ps)
    {
        var fa = new List<P2>();
        var fb = new List<P2>();
        var ans = new int[ n];
        ps = ps.OrderBy(x => x.x).ToArray();
        for (int i = 0; i < n; i++)
        {
            var a = ps[i];
            var b = ps[i + n];
            if (a.froma && !b.froma) ans[a.id] = b.x;
            else if (!a.froma && b.froma) ans[b.id] = a.x;
            else if (a.froma && b.froma) fa.Add(new P2 { id1 = a.id, x1 = a.x, id2 = b.id, x2 = b.x });
            else fb.Add(new P2 { id1 = a.id, x1 = a.x, id2 = b.id, x2 = b.x });
        }
        if (fa.Count() > 0) getAns2(fa, fb,ans);
        Console.WriteLine(string.Join(" ",ans));
    }
}