题目简述:
我的思路:
用数组p,q记录下a[i]是属于哪个组的,反正是二选一,要是第三个相同的数出现的,判为无解即可。
然后用队列pp,q填满p和q即可。先遍历a,没有轮到的就从1到n填充,每填充完一个就标记一下1是不属于a数组的标记,2是在a中出现过的。
代码:
#include <bits/stdc++.h>
using namespace std;
queue<int> pp;
queue<int> qq;
int main(){
int n,a[100005],p[100005],q[100005],flag=1,cntp=1,cntq=1;
cin>>n;
memset(p,0,sizeof p);
memset(q,0,sizeof q);
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
if (!p[a[i]] )p[a[i]]=1;
else if (!q[a[i]]) q[a[i]]=1;//先在p中标记
else if(p[a[i]] && q[a[i]]){
flag=0;//如果都有了就输出-1
break;
}
}
if(!flag) cout<<-1;
else{
for(int i=0;i<n;i++){
if (p[a[i]]&&p[a[i]]!=2){//在a中且没有标记过的
p[a[i]]=2;
pp.push(a[i]);
while(q[cntq]) cntq++;//从1到n填充
qq.push(cntq);
q[cntq]=1;
cntq++;
}else if (q[a[i]]&&q[a[i]]!=2){//同理
q[a[i]]=2;
qq.push(a[i]);
while(p[cntp]) cntp++;
pp.push(cntp);
p[cntp]=1;
cntp++;
}
}
while(pp.size()>1) {
cout<<pp.front()<<" ";
pp.pop();
}
cout<<pp.front()<<endl;
pp.pop();
while(qq.size()>1) {
cout<<qq.front()<<" ";
qq.pop();
}
cout<<qq.front()<<endl;
qq.pop();
}
return 0;
}