問題文
与えられているのは、長さNの2つのシーケンスAとBです。AとBは、それぞれ昇順でソートされます。各i(1≤i≤N)に対してAi≠Biが成り立つようにBの項を並べ替えることが可能かどうかを確認し、可能であれば、それを実現する並べ替えを出力します。
----------------
入力
入力は、以下の形式で標準入力から与えられる:
N
A1 A2⋯AN
B1 B2⋯BN
------------- ———
出力
条件を満たす再注文がない場合は、「いいえ」と出力します。
条件を満たす並べ替えが存在する場合は、最初の行に「はい」と出力します。その後、2行目にBの並べ替えを印刷し、用語を空白で区切ります。
条件を満たす複数の並べ替えがある場合は、それらのいずれかを印刷できます。
————————————————
サンプル入力1
6
1 1 1 2 2 3
1 1 1 2 2 3
サンプル出力1
はい22
3 1 1 1
————————————————
サンプル入力2
3
1 1 2
1 1 3
サンプル出力2
いいえ
題名
小さいものから大きいものへと配置されたAとBの2つの配列が与えられた場合、AiがどのiについてもBiと等しくないようにBを任意に置き換えることができるかどうか。
アイデア
小さいものから大きいものへと並べ替えられたので、最初にB配列を反転してから、前から後ろにトラバースします。同じものが見つかった場合は、このビットと交換して2つの異なる番号を存在させることができる番号がB配列にあるかどうかを調べます。交換しないと、結果は存在しません。
コード
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
int n,ans,res,sit,a[maxn],b[maxn];
int main()
{
//ios::sync_with_stdio(false);
//cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i>=1;i--)
cin>>b[i];
for(int i=1;i<=n;i++)
{
if(a[i]==b[i])
{
bool flag=0;
for(int j=1;j<=n;j++)
{
if(a[i]!=b[j]&&a[j]!=b[i])
{
swap(b[i],b[j]);
flag=1;
break;
}
}
if(!flag)
{
cout<<"No"<<endl;
return 0;
}
}
}
cout<<"Yes"<<endl;
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
return 0;
}