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++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=200000;
int n;
int a[Maxn+5],b[Maxn+5];
int c[Maxn+5];
int num_a[Maxn+5],num_b[Maxn+5];
int left[Maxn+5],right[Maxn+5];
int id[Maxn+5];
bool cmp(int p,int q){
	if(num_a[p]==num_a[q]){
		return num_b[p]>num_b[q];
	}
	return num_a[p]>num_a[q];
}
int fa[Maxn+5];
int find(int x){
	if(x==fa[x]){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fa_x=find(x),fa_y=find(y);
	if(fa_x==fa_y){
		return;
	}
	fa[fa_y]=fa_x;
}
void luangao(){
	int T=100;
	while(T--){
		bool flag=1;
		for(int i=1,j;i<=n;i=j+1){
			j=i;
			while(j<=n&&num_a[i]==num_a[j]){
				j++;
			}
			j--;
			random_shuffle(id+i,id+1+j);
		}
		for(int i=1;i<=n;i++){
			num_b[i]=0;
		}
		for(int i=1;i<=n+1;i++){
			fa[i]=i;
			c[i]=0;
			num_b[b[i]]++;
		}
		for(int TT=1;TT<=n;TT++){
			int i=id[TT];
			if(num_b[i]==0){
				continue;
			}
			for(int j=find(1);j<=n&&num_b[i]>0;j=find(j+1)){
				if(a[j]==i){
					j=find(right[i]+1);
					if(j>n){
						break;
					}
				}
				c[j]=i;
				num_b[i]--;
				merge(j+1,j);
			}
			if(num_b[i]){
				flag=0;
				break;
			}
		}
		if(flag){
			for(int i=1;i<=n;i++){
				printf("%d ",c[i]);
			}
			puts("");
			exit(0);
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		num_a[a[i]]++;
		if(left[a[i]]==0){
			left[a[i]]=i;
		}
		right[a[i]]=i;
		id[i]=i;
		fa[i]=i;
	}
	fa[n+1]=n+1;
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
		num_b[b[i]]++;
	}
	sort(id+1,id+1+n,cmp);
	for(int TT=1;TT<=n;TT++){
		int i=id[TT];
		if(num_b[i]==0){
			continue;
		}
		for(int j=find(1);j<=n&&num_b[i]>0;j=find(j+1)){
			if(a[j]==i){
				j=find(right[i]+1);
				if(j>n){
					break;
				}
			}
			c[j]=i;
			num_b[i]--;
			merge(j+1,j);
		}
		if(num_b[i]){
			luangao();
			puts("No");
			return 0;
		}
	}
	puts("Yes");
	for(int i=1;i<=n;i++){
		printf("%d ",c[i]);
	}
	puts("");
	return 0;
}