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 Java (OpenJDK 1.8.0) (judge verdict: Accepted)


import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        solve(System.in, System.out);
    }

    static void solve(InputStream is, PrintStream os) {
        // Your code here!
        Scanner sc = new Scanner(is);
        int N = sc.nextInt();
        int A[] = new int[N];
        int B[] = new int[N];

        for (int i = 0; i < N; i++) {
            A[i] = sc.nextInt();
        }
        for (int i = 0; i < N; i++) {
            B[i] = sc.nextInt();
        }

        if(N ==1) {
            os.println("No");
            return;
        }

        int secondP = 1;

        for (int i = 0; i < N; i++) {
            if(0 < i && A[i] != A[i-1])
                secondP = 0;
            if(A[i] == B[i]){
                while(secondP < N) {
                    if(A[i] != B[secondP] && A[secondP] != B[i]) {
                        int tmp = B[i];
                        B[i] = B[secondP];
                        B[secondP] = tmp;
                        break;
                    }
                    secondP++;

                }
                if(A[i] == B[i]) {
                    os.println("No");
                    return;
                }
            }
        }
        os.println("Yes");
        for (int i = 0; i < N; i++) {
            os.print(B[i]);
            if(i < N-1)
                os.print(" ");
        }
        os.println();
    }

}