B
思路是先对第一个输入处理后,
从第二个输入开始,当前输入如果大于前一个输入,那么输出等于此输入,并且把未用到的数字存在c中,end为指向数组末尾,用来保存数字。
如果当前输入等于前一个输入,那么输出c数组最前面的没被用的数字,begin指向数组开头,用于取数字。
开始最后一起输出,导致超时,边循环边输出就过了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool flag;
int a[100010];
int b[100010];
int c[100010];
int main(){
ios::sync_with_stdio(false);
cout.tie(NULL);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
flag=true;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]<i){
flag=false;
string s;
getline(cin,s);//开始这里用了continue然后导致没输入完一直不对
break;
}
}
int num;
int begin=1;
int end=1;
if(flag==false){
cout<<"-1";
}
else{
b[1]=a[1];
cout<<b[1]<<' ';
if(a[1]>1){
for(int i=1;i<a[1];i++){
c[i]=i;
}
begin=1;
end=a[1]-1;
}
else end=0;
for(int i=2;i<=n;i++){
if(a[i-1]<a[i]){
b[i]=a[i];
cout<<b[i]<<' ';
for(int j=a[i-1]+1;j<a[i];j++){
c[end+j-a[i-1]]=j;
}
end+=a[i]-a[i-1]-1;
}
else{
b[i]=c[begin];
cout<<b[i]<<' ';
begin++;
}
}
}
cout<<endl;
}
return 0;
}