CodeForces 1144C

链接 https://vjudge.net/problem/CodeForces-1144C

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, num, size;
    priority_queue<int, vector<int>, greater<int> > q; // 由小到大的优先队列
    priority_queue<int> p; // 由大到小的优先队列
    set<int> s;
    set<int> s1;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        size = s.size();    //集合s的长度
        scanf("%d", &num);
        s.insert(num);
        if(s.size() != size) { // 未出现重复的数字,将数字压入p队列
            p.push(num);
        } else { // 否则压入q队列 ,同时用set对q中的数字个数进行统计
            q.push(num);
            s1.insert(num);
        }
    }
    size = s1.size() + p.size();
    if(n == size) { // 如果两个队列的数的个数等于n,输出yes
        printf("YES\n");
        printf("%d\n", q.size());
        if(q.size() != 0) { // q不为0时,
            printf("%d", q.top());   //top为输出顶栈数字
            q.pop();  //删除顶栈
            while(!q.empty()) {   //当没删完的时候
                printf(" %d", q.top());  //继续输出顶栈
                q.pop();
            }
        }
        printf("\n");
        printf("%d\n", p.size());
        if(p.size() != 0) { // p不为0时
            printf("%d", p.top());  //输出顶栈
            p.pop();              //删除顶栈
            while(!p.empty()) {       //没删完的时候
                printf(" %d", p.top());        //输出顶栈
                p.pop();       //删除顶栈
            }
        }
    } else {             //如果不等于n,说明相同的数字出现三次以上 
        printf("NO");
    }
    return 0;
}
/*给出一个数n,下一行给出n个数,在这个序列中要拆分成两个子序列,
一个是递增序列(不能出现相同的元素),一个是递减序列(不能出现相同的元素)。
如果能拆分出来,则输出YES和两个序列的大小和数值,不能的话输出NO。*/ 

 

posted @ 2019-10-07 15:05  晴屿  阅读(366)  评论(0编辑  收藏  举报