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<<'
';
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308820.html