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

fn main() {
    proconio::input! {
        n: usize,
        a_s: [usize; n],
        b_s: [usize; n],
    }
    let mut ma_s = std::collections::BTreeMap::<usize, usize>::new();
    let mut mb_s = std::collections::BTreeMap::<usize, usize>::new();
    for a in &a_s {
        *ma_s.entry(*a).or_insert(0) += 1;
    }
    for b in &b_s {
        *mb_s.entry(*b).or_insert(0) += 1;
    }
    for (akey, avalue) in &ma_s {
        if *avalue <= n / 2 {
            // all ok
        } else {
            match mb_s.get(akey) {
                Some(bvalue) => {
                    if *bvalue <= n / 2 {
                        // ok
                    } else {
                        println!("No");
                        return;
                    }
                }
                None => {}
            }
        }
    }
    let mut ret = vec![];
    for a in a_s {
        let mut del_key = None;
        for (key, value) in mb_s.iter_mut().rev() {
            if *key != a {
                ret.push(*key);
                *value -= 1;
                if *value == 0 {
                    del_key = Some(*key);
                    break;
                }
            }
        }
        match del_key {
            Some(del_key) => {
                mb_s.remove(&del_key);
            }
            None => {}
        }
    }
    println!("Yes");
    println!(
        "{}",
        ret.iter()
            .map(|x| x.to_string())
            .collect::<Vec<_>>()
            .join(" ")
    );
}