CF1144G Two Merged Sequences 题解
考虑从左到右贪心加入每个数。
记 $x,y,a$ 分别表示上升序列的最后一个元素、下降序列的最后一个元素、当前要加入的元素。
-
若 $a\le x\land a\ge y$,可以直接输出
NO
了。 -
否则如果 $a\le x\lor a\ge y$,那就只有一种方案,直接更新 $x,y$。
-
下面考虑加到两个序列都合法的情况。若 $a_i=a_{i+1}$,则两种方案一样,两个数会一个加到上升序列,一个加到递减序列。若 $a_i<a_{i+1}$,则加到递减序列后 $a_{i+1}$ 就肯定会加到递增序列,这时如果再来个 $[a_i,a_{i+1}]$ 之间的数就不行了,所以 $a_i$ 肯定加到递增序列,$a_i>a_{i+1}$ 的情况同理(一定加到递减序列)。
参考代码:
#include<bits/stdc++.h>
#define mxn 200003
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
int n,d1,d2,a[mxn];
signed main(){
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]);
d1=-1,d2=2e9;
rep(i,1,n){
if(a[i]>d1&&(a[i]>=d2||a[i]<a[i+1]))d1=a[i],a[i]=0;
else if(a[i]<d2)d2=a[i],a[i]=1;
else{
puts("NO");
return 0;
}
}
puts("YES");
rep(i,1,n)printf("%d ",a[i]);
return 0;
}