题意 :
- 对于一个长度为n的排列和一个空序列ans,每次取当前最左边或者最右边中最小的值,如果取的是最左边,插入序列ans的最左边,然后在排列中删除这个数,如果取的是最右边,插入最右边,删除
- 现在给出ans序列,问是否存在排列使得操作后的结果是ans,输出任意方案
思路 :
- 首先,最后插入的数字一定是排列中最大的数字,也就是它一定在ans的左/右
- 我们检测ans的首尾是否有一个n,如果不存在一定无解
- 如果存在 :
- 1.
ans[1] == n
,我们把ans[1]放到原数组的最左边,由于它是最大的,在每一次的操作中,它都可以让另一个数被取走,它本身最后才被取走,由于构造出来的结果是最外层的先被比较然后放入新的序列中,因此,将 [ 2 , n ] [2,n] [2,n]逆序即可 - 2.
ans[n] == n
,对于 [ 1 , n − 1 ] [1,n-1] [1,n−1]的数字,它们同样是逆序存储的 - reverse第二个参数是)而不是]的
return cout << xxx << endl, void();
,就不用换行return了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_set>
#include <math.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
#define endl '\n'
#define fi first
#define se second
#define push_back
#define rep(i, l, r) for (ll i = l; i <= r; i ++ )
const int N = 2e5 + 10;
int n, a[N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
if (a[1] != n && a[n] != n) return cout << -1 << endl, void();
if (a[1] == n) reverse(a + 2, a + n + 1);
else if (a[n] == n) reverse(a + 1, a + n);
for (int i = 1; i <= n; i ++ ) cout << a[i] << " \n"[i == n];
}
int main()
{
cin.tie(nullptr) -> sync_with_stdio(false);
int _;
cin >> _;
while (_ -- )
solve();
return 0;
}