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 11.0.6) (judge verdict: Wrong Answer)

//Created by Aminul on 9/13/2020.

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Random;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) throws Exception {
        FastReader in = new FastReader(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        int n = in.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = in.nextInt();
        }
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for (int i = 0; i < n; i++) {
            int x = in.nextInt();
            b[i] = x;
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        int majA = majorityElement(n, a), majB = majorityElement(n, b);
        if (majA != -1 && majA == majB) {
            pw.println("No");
            debug("nooooo");
        } else {
            int[] B = b.clone();
            b = solve_1(n, a, B.clone());
            if(b == null) b = solve_map(n, a, (TreeMap<Integer, Integer>) map.clone());
            if(b == null) b = solve_map_2(n, a, (TreeMap<Integer, Integer>) map.clone());
            if(b == null) b = solveRandom(n, a, B);
            if (b == null) pw.println("No");
            else {
                pw.println("Yes");
                for (int i : b) pw.print(i + " ");
                pw.println();
            }
        }

        pw.close();
    }

    static boolean check(int n, int[] a, int[] b) {
        for (int i = 0; i < n; i++) {
            if (a[i] == b[i]) return false;
        }
        return true;
    }

    static int[] solveRandom(int n, int[] a, int[] b) {
        for (int i = 0; i < 550; i++) {
            shuffle(b);
            if (check(n, a, b)) return b;
        }
        return null;
    }

    public static void shuffle(int[] a) {
        Random rnd = new Random();
        for (int i = a.length - 1; i >= 1; i--) {
            int j = rnd.nextInt(i + 1);
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    static int[] solve_1(int n, int[] a, int b[]) {
        n--;
        int N = n;
        for (int i = 0; i <= n; i++) {
            if (a[i] == b[i]) {
                int tmp = b[n];
                b[n] = b[i];
                b[i] = tmp;
                n--;
            }
        }
        if(!check(n, a, b)) return null;
        return b;
    }

    static int[] solve_map_2(int n, int[] a, TreeMap<Integer, Integer> map) {
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            Integer val = map.firstKey();
            if (val.equals(a[i])) val = map.lastKey();
            if (val.equals(a[i])) val = map.lowerKey(a[i]);
            if (val == null) val = map.higherKey(a[i]);
            //debug(i, a[i], val);
            if (val == null) return null;
            map.put(val, map.getOrDefault(val, 0) - 1);
            if (map.get(val) == 0) map.remove(val);
            b[i] = val;
        }
        return b;
    }

    static int[] solve_map(int n, int[] a, TreeMap<Integer, Integer> map) {
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            Integer val = map.lastKey();
            if (val.equals(a[i])) val = map.firstKey();
            if (val.equals(a[i])) val = map.lowerKey(a[i]);
            if (val == null) val = map.higherKey(a[i]);
            //debug(i, a[i], val);
            if (val == null) return null;
            map.put(val, map.getOrDefault(val, 0) - 1);
            if (map.get(val) == 0) map.remove(val);
            b[i] = val;
        }
        return b;
    }

    static int majorityElement(int n, int[] a) {
        int f[] = new int[n + 1];
        for (int i : a) {
            f[i]++;
            if (f[i] > n / 2) return i;
        }
        return -1;
    }

    static void debug(Object... obj) {
        System.err.println(Arrays.deepToString(obj));
    }

    static class FastReader {
        InputStream is;
        private byte[] inbuf = new byte[1024];
        private int lenbuf = 0, ptrbuf = 0;

        public FastReader(InputStream is) {
            this.is = is;
        }

        public int readByte() {
            if (lenbuf == -1) throw new InputMismatchException();
            if (ptrbuf >= lenbuf) {
                ptrbuf = 0;
                try {
                    lenbuf = is.read(inbuf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (lenbuf <= 0) return -1;
            }
            return inbuf[ptrbuf++];
        }

        public boolean isSpaceChar(int c) {
            return !(c >= 33 && c <= 126);
        }

        private boolean isEndOfLine(int c) {
            return c == '\n' || c == '\r' || c == -1;
        }

        public int skip() {
            int b;
            while ((b = readByte()) != -1 && isSpaceChar(b)) ;
            return b;
        }

        public String next() {
            int b = skip();
            StringBuilder sb = new StringBuilder();
            while (!(isSpaceChar(b))) {
                sb.appendCodePoint(b);
                b = readByte();
            }
            return sb.toString();
        }


        public String nextLine() {
            int c = skip();
            StringBuilder sb = new StringBuilder();
            while (!isEndOfLine(c)) {
                sb.appendCodePoint(c);
                c = readByte();
            }
            return sb.toString();
        }

        public int nextInt() {
            int num = 0, b;
            boolean minus = false;
            while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) ;
            if (b == '-') {
                minus = true;
                b = readByte();
            }
            while (true) {
                if (b >= '0' && b <= '9') {
                    num = (num << 3) + (num << 1) + (b - '0');
                } else {
                    return minus ? -num : num;
                }
                b = readByte();
            }
        }

        public long nextLong() {
            long num = 0;
            int b;
            boolean minus = false;
            while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) ;
            if (b == '-') {
                minus = true;
                b = readByte();
            }

            while (true) {
                if (b >= '0' && b <= '9') {
                    num = (num << 3) + (num << 1) + (b - '0');
                } else {
                    return minus ? -num : num;
                }
                b = readByte();
            }
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public char[] next(int n) {
            char[] buf = new char[n];
            int b = skip(), p = 0;
            while (p < n && !(isSpaceChar(b))) {
                buf[p++] = (char) b;
                b = readByte();
            }
            return n == p ? buf : Arrays.copyOf(buf, p);
        }

        public char readChar() {
            return (char) skip();
        }
    }
}