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;
}
posted @ 2023-10-24 18:53  zifanwang  阅读(2)  评论(0编辑  收藏  举报  来源