这题的难度属于是只要你想到了就很简单,但是想不到就死活做不出来。

我做不出来就是不好.doge alt

我们来看看这道题,这道题定义的左看是满足大于其左边所有数的一个数列,并且它已经把左看数组给出来了。 右看同理。

那么,如果我们想要构造一个数组让他的左看和右看都满足,那么(因为是严格单增的,不然还要排个序)必须要保证的就是两个数组的最大数值相等。(第一个条件)

不然你不论怎么构造这个数组,这俩最大值都会出现在彼此的数组里。

就比如说左看是{1,5},右看是{1,6},那么6一定会出现在{1,5}里,就构造不出来(这就是最大值不相等的结果)。cout

接下来我们继续分析。

现在我们的左右看数组最大值都相同了。那么,我们要想让左看数组不会包含右看数组的元素,那我们就把左看拼接在左,右看拼接在右就行了。

就比如说左看:{1,3,5} 右看{2,4,5} 1,3,5,4,2

(有最大值拦着就不会出现别的数字)

现在,拼接完毕。

但是还有一点需要考虑,就是我们构造的这个数组一定存在,前提是长度我们自己定。

我们数组的长度最短是x+y-1,不然值覆盖不完。那如果n<x+y-1,直接-1,因为这是不可能存在的。

否则: 我们就先输出左看和右看数组,再在结尾补右看的最后一个数直到补满长度就行。 因为最后一个数都是等价的,你输入几个也不会有影响。

所以综上代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int x,y,n;
	cin>>x>>y>>n;
	
	vector<int> c(x+1);
	vector<int> d(y+1);
	
	for(int i=1;i<=x;i++)
		cin>>c[i];
	for(int i=1;i<=y;i++)
		cin>>d[i];
	
	if(x+y-1>n)
	{
		cout<<-1;
		return 0;
	}	
	else if(c[x]!=d[y])
	{
		cout<<-1;
		return 0;
	}		
	else{
		for(int i=1;i<=x;i++)
			cout<<c[i]<<' ';
		for(int i=y-1;i>=1;i--)
			cout<<d[i]<<' ';
		for(int i=1;i<=n-(x+y-1);i++)
			cout<<d[1]<<" ";
	}
	
}

一个蒟蒻的代码罢辽 就这样,到此一游。