题目链接
http://codeforces.com/contest/1144/problem/C
题意
给一个数组,求能否分成两个数组,一个严格递增,一个严格递减,给出一种方案即可。
思路
-
如果数组中某个数字重复出现了3次及以上,输出NO。
-
否则就是YES,可以先递增输出一边,然后剩下的递减输出。
AC代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int maxn = 200010;
int a[maxn];
int cnt[maxn];
int a1[maxn];
int a2[maxn];
set<int> s;
set<int>::iterator it;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int n, ans1 = 0, ans2 = 0, isok = 1;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
cnt[a[i]]++;
s.insert(a[i]);
if(cnt[a[i]] > 2)
isok = false;
}
for(it = s.begin(); it != s.end(); it++) {
a1[ans1++] = *it;
cnt[*it]--;
}
for(int i = maxn - 1; i >= 0; i--) {
if(cnt[i] == 1)
a2[ans2++] = i;
}
if(isok) {
printf("YES\n%d\n", ans1);
for(int i = 0; i < ans1; i++) {
if(i == 0)
printf("%d", a1[i]);
else
printf(" %d", a1[i]);
}
printf("\n");
printf("%d\n", ans2);
for(int i = 0; i < ans2; i++) {
if(i == 0)
printf("%d", a2[i]);
else
printf(" %d", a2[i]);
}
printf("\n");
}
else {
printf("NO\n");
}
return 0;
}