codeforces 1209/C Paint the Digits 观察

题意
给你一个序列
问你能否选出两个序列 然后拼接
是他们成为有序的序列 输出方案

解:
说下我的思路
开始我吧题目看错了以为求的是单调递减的。。。
这题考的是贪心加观察
后来才发现
然后我又试了lis 树状数组 都不行
最后我发现对于一个序列 最终状态一定是有序的
那么我们不妨对于这个序列首先进行双关键字排序
然后 最小的一个一定是标号为1 然后 我们对于每一个必须为1 的标上1

注意判断重复元素
code:

//
//  main.cpp
//  sadf
//
//  Created by ALEZ on 2019/9/15.
//  Copyright © 2019 比赛. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxnn 2000000
struct node
{
    int val,id;
}ed[maxnn];
int mask[maxnn];
int tot=0;
string s;
bool cmp(node a,node b){
    if(a.val==b.val)
    return a.id<b.id;
    return a.val<b.val;
}
int T,n;
int k[maxnn];
int main()
{
    cin>>T;
    while(T--)
    {
        for(int i=1;i<=n;i++)mask[i]=0,k[i]=0;
        cin>>n;
        tot=0;
        cin>>s;
        for(int i=0;i<s.size();i++)
        {
            ed[++tot].id=i+1;
            ed[tot].val=s[i]-'0';
        }
        sort(ed+1,ed+1+tot,cmp);
    int biao=0;
    int las=ed[1].id;
    k[ed[1].id]=1;
        mask[ed[1].id]=1;
        int fla=0;
        int p=0;
    for(int i=2;i<=tot;i++)
    {
	if(biao)
	if(ed[i].val>ed[biao].val) break;
        if(p)
        {
            if(ed[p].val==ed[i].val)p=0;
            else break;
        }
        if(ed[i].id<las)
        {
            fla=1;
            p=i;
	biao=i;
            continue;
        }
        k[ed[i].id]=1;
        mask[ed[i].id]=1;
        las=ed[i].id;
    }
        if(fla)
        {
            int u=1;
            while(mask[ed[u].id])u++;
             las=ed[u].id;
            k[ed[u].id]=2;
            mask[ed[u].id]=1;
            for(int i=u;i<=tot;i++)
            {
                if(mask[ed[i].id])continue;
                if(las>ed[i].id)continue;
                k[ed[i].id]=2;
                mask[ed[i].id]=1;
                las=ed[i].id;
            }
        }
        int ffla=1;
        for(int i=1;i<=tot;i++)
        {
            if(!k[i])ffla=0;
        }
        if(ffla==0)
        {
            puts("-");
            continue;
        }
        else{
            for(int i=1;i<=tot;i++)
                cout<<k[i];
        }
        cout<<endl;
    }
}
刀剑映出了战士的心。而我的心,漆黑且残破
原文地址:https://www.cnblogs.com/OIEREDSION/p/11525354.html