思路:1.一个数最多出现两次,超过两次,输出-1,记录这个数两次出现的数组下标位置。2.统计1~n中没有出现的数字。3.两两组合构成排列。
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	vector<int>a(n);
	pair<int,int>hash[100010];
	for(int i=1;i<=n;i++)
	{
		hash[i].first=-1;
		hash[i].second=-1;
	}
	map<int,int>mp;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		mp[a[i]]++;	
	} 
	for(int i=0;i<n;i++)
	{
		if(hash[a[i]].first==-1)
		hash[a[i]].first=i;
		else if(hash[a[i]].second==-1)
		hash[a[i]].second=i;
		else
		{
			cout<<-1<<endl;
			return 0;
		}
	}
	vector<int>zero;
	for(int i=1;i<=n;i++)
	{
		if(mp[i]==0)
		zero.push_back(i);
	}
	
//	for(int i=1;i<=n;i++)
//	cout<<hash[i].first<<" "<<hash[i].second<<endl;
//	for(auto i:zero)
//	cout<<i<<" ";
//	cout<<endl;
	int cnt=0;
	vector<int>b1(n,0);
	vector<int>b2(n,0);
	for(int i=0;i<n;i++)
	{
		if(hash[a[i]].first!=-1&&hash[a[i]].second==-1)
		{
			b1[i]=a[i];
			b2[i]=a[i];
		}
		if(hash[a[i]].first!=-1&&hash[a[i]].second!=-1&&b1[i]==0&&b1[hash[a[i]].second]==0&&b2[i]==0&&b2[hash[a[i]].second]==0)
		{
			b1[i]=a[i];
			b1[hash[a[i]].second]=zero[cnt];
			b2[i]=zero[cnt];
			b2[hash[a[i]].second]=a[i];
			cnt++;
		}
	}
	for(auto i:b1)
	cout<<i<<" ";
	cout<<endl;
	for(auto i:b2)
	cout<<i<<" ";
	cout<<endl;
	return 0;
}