题目要求字典序最小,因此我们贪心的考虑,假设b数组为 4 3 6,那么我们贪心的考虑得到的结果是 1 4 2 3 5 6 ,但是如果b数组是8 7 4 5 那么我们不能够是1 8 2 7 3 4 6 5,因为最后一个数明显不符合。
因此我们从后往前枚举,寻找第一个比这个数小的数,然后删除这个数,因此我们可以采用lower_bound()函数来寻找第一个比它小的数,用vector记录除了选择的数,如果这个数被选,那么就erase。
那么什么情况下是-1呢?当然只有从后往前枚举的时候剩余的数不能找到和它匹配的数,也就是说没有比它小的数了,那么我们可以从1到n遍历,判断枚举到i时b数组中的数枚举到的数的个数和没有在b数组的个数,再进行比较即可。
代码附上:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+5;
int a[N];
int n;
int top=0;
vector<int>b;
int ans[N];
int vis[N];
void solve(){
cin>>n;
top=0;
b.clear();
for(int i=0;i<=n;i++)vis[i]=0;
for(int i=1;i<=n/2;i++)cin>>a[i];
for(int i=1;i<=n/2;i++){
if(!vis[a[i]])vis[a[i]]=1;
else {
cout<<-1<<"\n";
return;
}
}
int c1=0,c2=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
b.push_back(i);
c1++;
}
else {
c2++;
if(c1<c2){
cout<<-1<<"\n";
return;
}
}
}
sort(b.begin(),b.end());
for(int i=n/2;i>=1;i--){
int p=lower_bound(b.begin(),b.end(),a[i])-b.begin()-1;
ans[i]=b[p];
b.erase(b.begin()+p);
}
for(int i=1;i<=n/2;i++){
cout<<ans[i]<<" "<<a[i]<<" ";
}
cout<<"\n";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}