リンク:https://codeforces.com/contest/1283/problem/C
お互いに新年のための贈り物を与えたいNN友人があります。それぞれの友人は正確に一つの贈り物を与え、正確に一つの贈り物を受け取る必要があります。友人は、自分自身への贈り物を与えることはできません。
各友人のために値のフィフィが知られている:II番目の友人は、彼が第II場合や1≤fi≤n1≤fi≤n贈り物を与えることを望んでいる人を知っていない場合、それはどちらかであるFiを= 0fi = 0友人は友人のフィフィへの贈り物を与えることを望んでいます。
あなたはそれぞれの友人が正確に一つの贈り物を与え、正確に一つの贈り物を受け取り、自分自身への贈り物を与える一切の友人が存在しないような方法で(FI = 0fi = 0)、未知の値を入力します。初期情報が矛盾しないことが保証されます。
いくつかの答えがある場合は、いずれかを印刷することができます。
入力
友人の数 - 入力の最初の行は1つの整数NN(2≤n≤2⋅1052≤n≤2⋅105)を含みます。
入力の2行目は、NN整数F1、F2、...、fnf1、F2、...、FN(0≤fi≤n0≤fi≤nは、FI≠IFI≠I、すべてのFiを≠0fi≠0が明瞭である)が含まれフィフィは、どちらかFiを= 0fi = 0 II番目の友人は、彼が第II友人がに贈り物をしたい場合や1≤fi≤n1≤fi≤n贈り物を与えることを望んでいる人を知っていない場合友達フィフィ。また、少なくとも二つの値Fiを= 0fi = 0があることが保証されています。
出力
Fiの≠0fi≠0または、ii番目の友人がに贈り物を与えることを望んでいる友人の数ならばnfinfiはフィフィと同じである必要がありnnは整数NF1、NF2、...、nfnnf1、NF2、...、NFNを、印刷します。すべての値nfinfiは別個のものでなければならない、nfinfiはIIと等しくすることはできません。それぞれの友人は正確に一つの贈り物を与え、正確に一つの贈り物を受け取り、自分自身への贈り物を与える一切の友人はありません。
いくつかの答えがある場合は、いずれかを印刷することができます。
例
入力
コピー
5 5 0 0 2 4
出力
コピー
5 3 1 2 4
入力
コピー
7 7 0 0 1 4 0 6
出力
コピー
7 3 2 1 4 5 6
入力
コピー
7 7 4 0 3 0 5 1
出力
コピー
7 4 2 3 5 6 1
入力
コピー
5 2 1 0 0 0
出力
コピー
2 1 4 3
コード:
#include <bits/stdc++.h>
using namespace std;
long long t,n,a,b,k,s;
long long f[200001];
map<long long ,long long >m;
queue<long long>q,p;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>f[i];
if(f[i]!=0)
{
m[f[i]]=1;
}
else
p.push(i);
}
for(int i=1;i<=n;i++)
{
if(m[i]==0)
q.push(i);
}
for(int i=1;i<=n;i++)
{
if(f[i]==0)
{
a=q.front();
q.pop();
if(a==i)
{
q.push(a);
a=q.front();
q.pop();
if(a==i)
{
b=p.front();
p.pop();
if(b==i)
{
b=p.front();
p.pop();
}
f[i]=f[b];
f[b]=a;
}
else
f[i]=a;
}
else
f[i]=a;
}
}
for(int i=1;i<=n;i++)
{
cout<<f[i]<<" ";
}
}