#include <iostream> #include <vector> #include <map> #include <set> using weight_t = uint32_t; using order_t = std::vector<weight_t>; using stat_t = std::map<weight_t, uint32_t>; struct sum_t { order_t order; stat_t stat; stat_t stat2; void add_sum(weight_t w) { order.emplace_back(w); if (stat.find(w) == stat.end()) { stat.emplace(std::make_pair(w, 1)); } else { stat[w] += 1; } } friend std::istream& operator>>(std::istream& in, sum_t& s) { uint32_t size; in >> size; s.order.reserve(size); for (;size > 0; --size) { weight_t w; in >> w; s.add_sum(w); } return in; } void process(std::ostream& out) { auto it = stat.begin(); weight_t sums_sum = 0; while (it != stat.end()) { sums_sum += it->second * it->first; stat2.emplace(it->first, sums_sum); ++it; } } weight_t get_cut_point() { auto rit = stat2.rbegin(); weight_t prev = rit->first; ++rit; for (; rit != stat2.rend(); ++rit) { if (rit->second < prev) { return rit->first; } } if (stat2.size() > 1) { return stat2.begin()->first; } else { return 0; } } void print_stat(std::ostream& out, stat_t const& st) const { for(auto it = st.begin(); it != st.end(); ++it) { out << "[" << it->first << "] -> "; out << it->second << "\n"; } } void print_stats(std::ostream& out) const { out << "stat:\n"; print_stat(out, stat); out << "stat2:\n"; print_stat(out, stat2); } friend std::ostream& operator<<(std::ostream& out, sum_t const& s) { s.print_stats(out); return out; } void print_result(std::ostream& out, weight_t cp) { for(auto const& e : order) { out << (e <= cp ? "N" : "T"); } out << std::endl; } }; uint32_t solution(std::istream& input, std::ostream& out) { uint32_t result = 0; sum_t sum; input >> sum; sum.process(out); weight_t cp = sum.get_cut_point(); // out << sum; sum.print_result(out, cp); return result; } #ifndef TEST int main(int argc, char* argv[]) { solution(std::cin, std::cout); return 0; } #endif
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <vector> #include <map> #include <set> using weight_t = uint32_t; using order_t = std::vector<weight_t>; using stat_t = std::map<weight_t, uint32_t>; struct sum_t { order_t order; stat_t stat; stat_t stat2; void add_sum(weight_t w) { order.emplace_back(w); if (stat.find(w) == stat.end()) { stat.emplace(std::make_pair(w, 1)); } else { stat[w] += 1; } } friend std::istream& operator>>(std::istream& in, sum_t& s) { uint32_t size; in >> size; s.order.reserve(size); for (;size > 0; --size) { weight_t w; in >> w; s.add_sum(w); } return in; } void process(std::ostream& out) { auto it = stat.begin(); weight_t sums_sum = 0; while (it != stat.end()) { sums_sum += it->second * it->first; stat2.emplace(it->first, sums_sum); ++it; } } weight_t get_cut_point() { auto rit = stat2.rbegin(); weight_t prev = rit->first; ++rit; for (; rit != stat2.rend(); ++rit) { if (rit->second < prev) { return rit->first; } } if (stat2.size() > 1) { return stat2.begin()->first; } else { return 0; } } void print_stat(std::ostream& out, stat_t const& st) const { for(auto it = st.begin(); it != st.end(); ++it) { out << "[" << it->first << "] -> "; out << it->second << "\n"; } } void print_stats(std::ostream& out) const { out << "stat:\n"; print_stat(out, stat); out << "stat2:\n"; print_stat(out, stat2); } friend std::ostream& operator<<(std::ostream& out, sum_t const& s) { s.print_stats(out); return out; } void print_result(std::ostream& out, weight_t cp) { for(auto const& e : order) { out << (e <= cp ? "N" : "T"); } out << std::endl; } }; uint32_t solution(std::istream& input, std::ostream& out) { uint32_t result = 0; sum_t sum; input >> sum; sum.process(out); weight_t cp = sum.get_cut_point(); // out << sum; sum.print_result(out, cp); return result; } #ifndef TEST int main(int argc, char* argv[]) { solution(std::cin, std::cout); return 0; } #endif |