链接 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 "); printf("%d ", 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(" "); printf("%d ", 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。*/