题目链接
http://codeforces.com/contest/1144/problem/G
题意:
给你一个长度为n的序列,问是否存在一种方案,把这个序列拆分成一个严格的上升子序列和一个严格的下降子序列。
不改变原序列的相对顺序。
如果不存在输出NO
如果存在输出YES。下一行输出n个数,第i个数在下降子序列中输出1,在上升子序列中输出0。
样例1
输入
9
5 1 3 6 8 2 9 0 10
输出
YES
1 0 0 0 0 1 0 1 0
样例2
输入
5
1 2 4 0 2
输出
NO
题解
看别人的题解做的
https://www.cnblogs.com/Dup4/p/10635933.html
代码
#include<algorithm>
#include <iostream>
#include<vector>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n;
int a[maxn];
int flag[maxn];
int ans1[maxn],ans2[maxn];
int x,y;
int main(){
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
bool flag2=true;
ans1[x]=-1;
ans2[y]=maxn;
for(int i=0;i<n;i++){
if(a[i]<=ans1[x]&&a[i]>=ans2[y]){
flag2=false;
break;
}else if(a[i]>ans1[x]&&a[i]<ans2[y]){
if(a[i]>a[i+1]) ans2[++y]=a[i],flag[i]=1;
else ans1[++x]=a[i];
}else if(a[i]>ans1[x]){
ans1[++x]=a[i];
}else{
ans2[++y]=a[i];
flag[i]=1;
}
}
if(flag2){
printf("YES\n");
for(int i=0;i<n;i++) printf("%d ",flag[i]);
}else{
printf("NO\n");
}
return 0;
}