Codeforces 1262B Box
思路:
1.从前往后遍历原序列,如果后减前大于一则将缺失的值放入队列中,如果前后两次一样则从队列中取一个值出来填上去,如果前小于后,那就非法了;
2.最后查看队列是否为空,不为空说明缺失值都填补上去了,那就输出序列;
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1e5+99;
int q[MAX_N];
int main(){
IOS;
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int pre=0;
queue<int> que;
bool flag=true;
rp(i,n){
cin>>q[i];
int pp=q[i];
if(!flag) continue;
if(q[i]-pre>1){
for(int j=pre+1;j<q[i];j++) que.push(j);
}else if(q[i]-pre==0){
if(que.empty()) flag=false;
q[i]=que.front();
que.pop();
}else if(q[i]<pre) flag=false;
pre=pp;
}
if(que.empty()&&flag){
cout<<q[0];
for(int i=1;i<n;i++) cout<<' '<<q[i];
}else cout<<-1;
cout<<'\n';
}
return 0;
}