1.​​题目链接​​。题目大意:给定一个序列,这个序列可能是由一个严格单调递增,一个严格单调递减的序列组成。把这两个序列找出来,如果找不出来,输出NO,找出来输出Yes并把分组信息输出。

2.这个题其实可以贪心的选择。因为题目种有一个信息很关键,就是序列在合并之后,相对位置不会改变。所以对于每一个元素,我们考虑可以把它放在哪个序列里面,维护一个严格递增的,一个严格递减的。对于任意一个元素,与当前维护的数组的最后一个元素比较,如果发现他只能被放入一个数组,那么就放进去,如果发现二者都能,那么我们考虑它放进去之后对后边一个元素的影响,因为我们是要尽可能的把这个序列找出来。所以如果当前元素是可以进入两个序列,那么如果它比它后边的哪个元素大,我们就把他放在递增的序列里,这样它后边的那个元素才有可能被放入递减的序列,反之亦然。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, a1[N];
#pragma warning(disable:4996)
vector<int>A, B;
int used[N];
const int INF = 1e9;
int main()
{
while (cin >> n)
{
A.clear();
B.clear();
memset(used, 0, sizeof(used));
A.push_back(-1);
B.push_back(INF);
for (int i = 1; i <=n; i++)
{
cin >> a1[i];
}
for (int i = 1; i <= n; i++)
{
int x = a1[i];
int a = A.back();
int b = B.back();
if (x <= a && x >= b)
{
puts("NO");
return 0;
}
else if (x > a&&x < b)
{
if (i == n)
used[i] = 1;
else
{
int y = a1[i + 1];
if (y > x)
{
A.push_back(x);
}
else
{
B.push_back(x);
used[i] = 1;
}
}
}
else if(x>a)
{
A.push_back(x);
}
else
{
B.push_back(x);
used[i] = 1;
}
}
puts("Yes");
for (int i = 1; i <= n; i++)
{
cout << used[i] << " ";
if (i == n)puts("");
}
}
}