#include <iostream> #include <map> #include <algorithm> using uint64 = std::uint64_t; using int64 = std::int64_t; bool check(int64 rows) { int64 l, a, b; int64 begin_temp_sum = 0; int64 end_temp_sum = 0; std::map<int, int64> tab; for(int row = 0; row < rows; row++){ std::cin >> l >> a >> b; tab[a] += l; tab[b] -= l; begin_temp_sum += l * a; end_temp_sum += l * b; } if(begin_temp_sum != end_temp_sum) return false; while(true){ auto s = tab.size(); if(s < 3) return true; auto first = tab.begin(); if(first->second == 0) { tab.erase(first); continue; } auto last = std::prev(tab.end()); if(last->second == 0) { tab.erase(last); continue; } if(last->second < 0 && first->second < 0) return false; if(first->second > 0){ while(last->second > 0) { last = prev(last); } last->second += first->second; tab[last->first -1] -= first->second; tab[first->first + 1] += first->second; first->second = 0; } else { while(first->second > 0) { first = next(first); } first->second += last->second; tab[last->first -1] += last->second; tab[first->first + 1] -= last->second; last->second = 0; } } } int main() { std::ios_base::sync_with_stdio(false); int64 n, rows; std::cin >> n; for(int i = 0; i < n; i++) { std::cin >> rows; auto ret = check(rows); if(ret) std::cout << "TAK\n"; else std::cout << "NIE\n"; } 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 | #include <iostream> #include <map> #include <algorithm> using uint64 = std::uint64_t; using int64 = std::int64_t; bool check(int64 rows) { int64 l, a, b; int64 begin_temp_sum = 0; int64 end_temp_sum = 0; std::map<int, int64> tab; for(int row = 0; row < rows; row++){ std::cin >> l >> a >> b; tab[a] += l; tab[b] -= l; begin_temp_sum += l * a; end_temp_sum += l * b; } if(begin_temp_sum != end_temp_sum) return false; while(true){ auto s = tab.size(); if(s < 3) return true; auto first = tab.begin(); if(first->second == 0) { tab.erase(first); continue; } auto last = std::prev(tab.end()); if(last->second == 0) { tab.erase(last); continue; } if(last->second < 0 && first->second < 0) return false; if(first->second > 0){ while(last->second > 0) { last = prev(last); } last->second += first->second; tab[last->first -1] -= first->second; tab[first->first + 1] += first->second; first->second = 0; } else { while(first->second > 0) { first = next(first); } first->second += last->second; tab[last->first -1] += last->second; tab[first->first + 1] -= last->second; last->second = 0; } } } int main() { std::ios_base::sync_with_stdio(false); int64 n, rows; std::cin >> n; for(int i = 0; i < n; i++) { std::cin >> rows; auto ret = check(rows); if(ret) std::cout << "TAK\n"; else std::cout << "NIE\n"; } return 0; } |