Description

{a}为一个n个数排列,n/2给n / 2个数{bb},bimax(a2i1,a2i)b_i表示max(a_{2i - 1},a_{2i})

求字典序最小的{a}

sample

6
6
4 3 6
4
2 4
8
8 7 2 3
6
6 4 2
4
4 4
8
8 7 4 5

    
1 4 2 3 5 6 
1 2 3 4 
-1
5 6 3 4 1 2 
-1
1 8 6 7 2 4 3 5 

Solution

每次需要选一个数放到bib_i前,需要保证后面的bib_i有比他小的数可选,且每次选的数尽量小(后面的数选的数尽量大)。

用set 1.判重,2. 二分查找 ,, 从后往前选,每次选刚好比他小的数。

code

int T,n,a[200010];

int main(){
	cin >> T;
	while(T--){
		set<int> s;
		cin >> n;
		bool yo = 1;
		rep(i,1,n)s.insert(i);
		rep(i,1,n / 2){
			rd(a[i * 2 ]);
			yo &= s.count(a[i * 2]);
			s.erase(a[i * 2]);
		}
		
		if(!yo){
			puts("-1");
			continue;
		}
		
		per(i,n / 2,1){
			auto it = s.lower_bound(a[i * 2]);
			if(it == s.begin()){
				yo = 0;
				break;
			}
			a[2 * i - 1] = *--it;
			s.erase(it);
		}
		if(!yo){
			puts("-1");
			continue;
		}
		else rep(i,1,n)printf("%d ",a[i]);
		printf("\n");
	}
	return 0;
}