#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; } |
English