#include <iostream> #include <map> using namespace std; typedef long long int lint; typedef long double ldouble; typedef map<int, ldouble> TempToLiters; struct Problem { int maxMam = 0; TempToLiters c; TempToLiters m; string result = ""; void solve() { readData(); while (result == "") { step(); } cout << result << endl; } void readData() { int n; cin >> n; lint sa = 0, sb = 0; int maxChce = 0; for (int i = 0; i < n; ++i) { lint l; int a, b; cin >> l >> a >> b; sa += l*a; sb += l*b; maxMam = max(maxMam, a); maxChce = max(maxChce, b); addLiters(m, a, l); addLiters(c, b, l); } if (sa != sb) { result = "NIE"; } if (maxChce > maxMam) { result = "NIE"; } } void step() { if (c.empty() || m.empty()) { if (!m.empty() || !c.empty()) { //result = "Gruba kaszana"; result = "TAK"; } else { result = "TAK"; } return ; } auto it_c = c.begin(); auto it_m = m.begin(); int b = it_c->first; ldouble n = it_c->second; int a = it_m->first; ldouble k = it_m->second; if (b < a) { // najmniejszy jaki chce jest mniejszy niz najmniejszy jaki mam result = "NIE"; return; } if (a == b) { //result = "dziwne..."; result = "TAK"; return ; } auto it_ap = m.upper_bound(b); if (it_ap == m.end()) { result = "NIE"; return ; } int ap = it_ap->first; ldouble x = n * (ap - b) / (ap - a); if (k >= x) { removeLiters(m, a, x); removeLiters(c, b, n); addLiters(c, ap, n-x); } else { ldouble y = k * (b - a) / (ap - b); removeLiters(m, a, k); removeLiters(c, b, y+k); addLiters(c, ap, y); } } void addLiters(TempToLiters& tempToLiters, int t, ldouble l) { tempToLiters[t] += l; if (mapContains(c, t) && mapContains(m, t)) { ldouble vol = min(c[t], m[t]); removeLiters(c, t, vol); removeLiters(m, t, vol); } } void removeLiters(TempToLiters& tempToLiters, int t, ldouble l) { tempToLiters[t] -= l; if (abs(tempToLiters[t]) < 1.0e-9L) { tempToLiters.erase(t); } } bool mapContains(const TempToLiters& tempToLiters, int t) { return tempToLiters.find(t) != tempToLiters.end(); } }; int main() { ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) { Problem p; p.solve(); } 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 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 | #include <iostream> #include <map> using namespace std; typedef long long int lint; typedef long double ldouble; typedef map<int, ldouble> TempToLiters; struct Problem { int maxMam = 0; TempToLiters c; TempToLiters m; string result = ""; void solve() { readData(); while (result == "") { step(); } cout << result << endl; } void readData() { int n; cin >> n; lint sa = 0, sb = 0; int maxChce = 0; for (int i = 0; i < n; ++i) { lint l; int a, b; cin >> l >> a >> b; sa += l*a; sb += l*b; maxMam = max(maxMam, a); maxChce = max(maxChce, b); addLiters(m, a, l); addLiters(c, b, l); } if (sa != sb) { result = "NIE"; } if (maxChce > maxMam) { result = "NIE"; } } void step() { if (c.empty() || m.empty()) { if (!m.empty() || !c.empty()) { //result = "Gruba kaszana"; result = "TAK"; } else { result = "TAK"; } return ; } auto it_c = c.begin(); auto it_m = m.begin(); int b = it_c->first; ldouble n = it_c->second; int a = it_m->first; ldouble k = it_m->second; if (b < a) { // najmniejszy jaki chce jest mniejszy niz najmniejszy jaki mam result = "NIE"; return; } if (a == b) { //result = "dziwne..."; result = "TAK"; return ; } auto it_ap = m.upper_bound(b); if (it_ap == m.end()) { result = "NIE"; return ; } int ap = it_ap->first; ldouble x = n * (ap - b) / (ap - a); if (k >= x) { removeLiters(m, a, x); removeLiters(c, b, n); addLiters(c, ap, n-x); } else { ldouble y = k * (b - a) / (ap - b); removeLiters(m, a, k); removeLiters(c, b, y+k); addLiters(c, ap, y); } } void addLiters(TempToLiters& tempToLiters, int t, ldouble l) { tempToLiters[t] += l; if (mapContains(c, t) && mapContains(m, t)) { ldouble vol = min(c[t], m[t]); removeLiters(c, t, vol); removeLiters(m, t, vol); } } void removeLiters(TempToLiters& tempToLiters, int t, ldouble l) { tempToLiters[t] -= l; if (abs(tempToLiters[t]) < 1.0e-9L) { tempToLiters.erase(t); } } bool mapContains(const TempToLiters& tempToLiters, int t) { return tempToLiters.find(t) != tempToLiters.end(); } }; int main() { ios_base::sync_with_stdio(false); int t; cin >> t; while(t--) { Problem p; p.solve(); } return 0; } |