题意:
给你n个数字,问你他们是不是由一个严格上升和一个严格下降的子序列组成的,如果是输出每个位置是在上升还是下降子序列中
题解:
直接贪心,假设我们现在有2个序列,走到当前这一位数的时候,如果它只能放其中的某一个,那么直接放,如果它一个都放不进,那么就是NO,如果它两个都能放,那么与它下一个比较,如果它比较大,放到下降的序列中,否则放到上升的序列中。为什么?假设我们现在的序列是这样的:
黑色的是已分配的序列,如果来了一个红色的,如果它比后面的要小的话,就放到上升子序列中,这样式最优的,因为它如果放到了下降的字序列中的话,在之后下降子序列的选择余地就会变小,很容易理解
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int vis[N],a[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int asc=-1,desc=N;
for(int i=1;i<=n;i++)
{
if(a[i]>=desc)
{
if(a[i]<=asc)
return 0*printf("NO\n");
asc=a[i];
}
else if(a[i]<=asc)
{
if(a[i]>=desc)
return 0*printf("NO\n");
desc=a[i];
vis[i]=1;
}
else
{
if(i==n)
break;
if(a[i]<=a[i+1])
asc=a[i];
else
desc=a[i],vis[i]=1;
}
}
printf("YES\n");
for(int i=1;i<=n;i++)
printf("%d%c",vis[i],i==n?'\n':' ');
return 0;
}