Codeforces 439C Devu and Partitioning of the Array
阿新 • • 發佈:2019-02-15
比較坑一題,很多細節需要把握。
奇數只能由奇數個奇陣列成,那讓奇陣列全由一個奇陣列成(除了某些情況,比如p = 0),然後就是各種細節各種判斷了。
#include <iostream> #include <cstdio> #include <vector> using namespace std; vector <__int64> even, odd; int main() { __int64 n, k, p, temp; scanf("%I64d%I64d%I64d", &n, &k, &p); for(int i = 0; i < n; i++) { scanf("%I64d", &temp); if(temp % 2 == 0) even.push_back(temp); else odd.push_back(temp); } __int64 _size_odd = odd.size(), _size_even = even.size(), i = 0, j = 0, remain, all; if(_size_odd < k - p || (_size_odd - (k - p)) % 2 != 0 || ((_size_odd - (k - p)) / 2) + _size_even < p) puts("NO"); else { puts("YES"); if(p == 0) { while(i < (k - p) - 1) printf("1 %I64d\n", odd[i++]); remain = _size_odd - i + _size_even; printf("%d", remain); while(i < _size_odd) printf(" %d", odd[i++]); while(j < _size_even) printf(" %d", even[j++]); puts(""); } else while(i < (k - p)) printf("1 %I64d\n", odd[i++]); if(p != 0) { while(true) { remain = p--; if(remain == 1) { all = _size_even - j + _size_odd - i; printf("%I64d", all); while(j < _size_even) printf(" %I64d", even[j++]); while(i < _size_odd) printf(" %I64d", odd[i++]); puts(""); break; } else { if(j < _size_even) printf("1 %I64d\n", even[j++]); else printf("2 %I64d %I64d\n", odd[i++], odd[i++]); } } } } return 0; }