#include <cstdio> #include <vector> #include <algorithm> struct cmp { bool operator()(const unsigned left, const unsigned right) const { return (right < left); } }; //void print(std::vector<unsigned>& v) /* { printf("Vector; size(%lu)\n[", v.size()); for(auto& el: v) { printf("%u, ", el); } printf("]\n"); } */ void print_tree(std::vector<unsigned>& tab) { // Tree must have sorted nodes from highest to lowest degree printf("%lu\n", tab.size()); size_t left = 0; size_t right = tab.size() - 1; while(left < right) { int left_degree = tab[left]; // int right_degree = tab[right]; while(left_degree > 1) { printf("%lu %lu\n", left + 1, right + 1); right--; left_degree--; } printf("%lu %lu\n", left + 1, left + 2); left++; tab[left]--; } } int main() { unsigned n; scanf("%u", &n); std::vector<unsigned> tab(n); unsigned current = 0; unsigned long total_sum = 0; for(unsigned i = 0; i < n; i++) { scanf("%u", ¤t); tab[i] = current; total_sum += current; } std::sort(tab.begin(), tab.end()); std::vector<unsigned> full_copy(tab); unsigned count = n; while((count > 2) && (total_sum > (2 * (count - 1)))) { total_sum -= tab.back(); tab.pop_back(); count--; } //print(tab); std::reverse(tab.begin(), tab.end()); if (total_sum < (2 * (count - 1))) { tab.back() += 2*(count -1) - total_sum; printf("1\n"); } else if (count == 2) { unsigned change = 0; for(auto& el: tab) { if (el != 1) { change += 1; } } //print(tab); printf("%u\n2\n1 2", change); return 0; } else { printf("0\n"); } print_tree(tab); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <cstdio> #include <vector> #include <algorithm> struct cmp { bool operator()(const unsigned left, const unsigned right) const { return (right < left); } }; //void print(std::vector<unsigned>& v) /* { printf("Vector; size(%lu)\n[", v.size()); for(auto& el: v) { printf("%u, ", el); } printf("]\n"); } */ void print_tree(std::vector<unsigned>& tab) { // Tree must have sorted nodes from highest to lowest degree printf("%lu\n", tab.size()); size_t left = 0; size_t right = tab.size() - 1; while(left < right) { int left_degree = tab[left]; // int right_degree = tab[right]; while(left_degree > 1) { printf("%lu %lu\n", left + 1, right + 1); right--; left_degree--; } printf("%lu %lu\n", left + 1, left + 2); left++; tab[left]--; } } int main() { unsigned n; scanf("%u", &n); std::vector<unsigned> tab(n); unsigned current = 0; unsigned long total_sum = 0; for(unsigned i = 0; i < n; i++) { scanf("%u", ¤t); tab[i] = current; total_sum += current; } std::sort(tab.begin(), tab.end()); std::vector<unsigned> full_copy(tab); unsigned count = n; while((count > 2) && (total_sum > (2 * (count - 1)))) { total_sum -= tab.back(); tab.pop_back(); count--; } //print(tab); std::reverse(tab.begin(), tab.end()); if (total_sum < (2 * (count - 1))) { tab.back() += 2*(count -1) - total_sum; printf("1\n"); } else if (count == 2) { unsigned change = 0; for(auto& el: tab) { if (el != 1) { change += 1; } } //print(tab); printf("%u\n2\n1 2", change); return 0; } else { printf("0\n"); } print_tree(tab); return 0; } |