前言:如何分析这个题目,如果一个数出现次数大于2这个序列一定是不能 构造的,我们优先安排第一个序列的,出现次数为2和1 的可以先安排,再补上次数为0 的凑数
#include<bits/stdc++.h>
using namespace std;
const int N = (int)1e5+5;
int a[N];int n;
int c[N];
int ans1[N];
int ans2[N];
vector<int> record[N];
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
record[a[i]].push_back(i);
if(record[a[i]].size()>=3){
cout << -1; return 0;
}
}
vector<int> one,zero;
for(int i=1;i<=n;i++){
int len = record[i].size();
if(len==0) {
zero.push_back(i);
one.push_back(i); continue;
}
if(len==1){
one.push_back(i);
int pos = record[i][0];
ans1[pos] = i;
}else{
int pos1 = record[i][0] , pos2 = record[i][1];
ans1[pos1] = i, ans2[pos2] = i;
}
}
for(int i=1,j=0;i<=n;i++){
if(ans1[i]) continue;
ans1[i] = zero[j]; j++;
}
for(int i=1,j=0;i<=n;i++){
if(ans2[i]) continue;
ans2[i] = one[j]; j++;
}
for(int i=1;i<=n;i++){
cout << ans1[i] << " ";
}
cout << endl;
for(int i=1;i<=n;i++){
cout << ans2[i] << " ";
}
return 0;
}