【cf 1144G】贪心选择一下

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("");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41863129/article/details/89499023
cf
今日推荐