cf1144G 将串分解成单调递增和递减子串(贪心)

这算哪门子dp..

具体做法就是贪心,建立两个vector存递增序列递减序列,操作过程中a可以合法地匀一个给b

就是判断第i个数放在递增序列里还是放在递减序列里,需要根据后面的数来进行决策

#include<bits/stdc++.h>
#define ll long long
#define P pair<ll,ll>
#define mp make_pair
#define fi first
#define se second
#define N 200100
using namespace std;

ll n,m,num[N],sy[N];
vector<P>a,b;

int main()
{
    ll i,j,p,q;
    cin>>n;
    for(i=1;i<=n;i++) scanf("%lld",&num[i]);
    a.push_back(mp(-1,0));
    b.push_back(mp(N,0));
    for(i=1;i<=n;i++)
    {
        if(num[i]<=a.back().fi&&num[i]>=b.back().fi)
        {
            puts("NO");
            return 0;
        }
        if(num[i]>a.back().fi)
        {
            sy[i]=0;
            a.push_back(mp(num[i],i));
            continue;
        }
        if(a.back().fi<b.back().fi&&a.back().se>b.back().se)
        {
            sy[a.back().se]=1;
            b.push_back(a.back());
            a.pop_back();
        }
        if(num[i]>a.back().fi)
        {
            sy[i]=0;
            a.push_back(mp(num[i],i));
            continue;
        }
        if(num[i]<b.back().fi)
        {
            sy[i]=1;
            b.push_back(mp(num[i],i));
            continue;
        }
        puts("NO");
        return 0;
    }
    puts("YES");
    for(i=1;i<=n;i++) printf("%lld ",sy[i]);
}

 

posted on 2019-04-02 14:59  zsben  阅读(300)  评论(0编辑  收藏  举报

导航