//Author: Piotr Zielinski #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, long double> PII; const int N = 2e3+5; long double EPS = 0.0000001; void solve() { int n, l, a, b; LL sumSrc = 0, sumDest = 0; cin >> n; vector<PII> src(n); vector<PII> dest(n); queue<PII> Q; for(int i = 0;i < n;++i) { cin >> l >> a >> b; src[i] = {a, l}; dest[i] = {b, l}; sumSrc += 1LL*l*a; sumDest += 1LL*l*b; } if(sumSrc != sumDest) { cout << "NIE\n"; return; } sort(src.begin(), src.end()); sort(dest.begin(), dest.end()); if(src[0].first > dest[0].first || src.back().first < dest.back().first) { cout << "NIE\n"; return; } int destCt = 0; a = 0, b = 0; while(b < n && destCt < n) { if(src[b].second <= EPS) { ++b; continue; } if(dest[destCt].first == src[b].first) { if(src[b].second < dest[destCt].second) { dest[destCt].second -= src[b].second; src[b].second = 0.0; ++b; continue; } src[b].second -= dest[destCt].second; ++destCt; continue; } if(dest[destCt].first+EPS >=src[b].first) { Q.push(src[b]); ++b; continue; } if(Q.empty()) { cout << "NIE\n"; return; } PII past = Q.front(); Q.pop(); long double x = (dest[destCt].second * (dest[destCt].first-src[b].first)) / (past.first - src[b].first); long double y = (dest[destCt].second * (past.first-dest[destCt].first)) / (past.first - src[b].first); if(past.second+EPS >= x && src[b].second+EPS >= y) { past.second -= x; src[b].second -= y; ++destCt; if(past.second > EPS) Q.push(past); //cout << "1 case" << endl; continue; } else if((past.second*(dest[destCt].first-past.first)) / (src[b].first-dest[destCt].first) <= src[b].second+EPS) { src[b].second -= (past.second*(dest[destCt].first-past.first)) / (src[b].first-dest[destCt].first); dest[destCt].second -= (past.second*(src[b].first-past.first)) / (src[b].first-dest[destCt].first); //cout << "2 case" << endl; continue; //cout << "AAAA " << x << " " << y << " " << src[a+2].second << " " << (x*(dest[destCt].first-src[a+1].first)) / (src[b].first-dest[destCt].first) << endl; } else { past.second -= (src[b].second*(dest[destCt].first-src[b].first)) / (past.first-dest[destCt].first); dest[destCt].second -= (src[b].second*(past.first-src[b].first)) / (past.first-dest[destCt].first); if(past.second > EPS) Q.push(past); ++b; //cout << "3 case" << endl; continue; } } //cout << a << " " << b <<" " << destCt << endl; if(destCt < n && dest[destCt].second > EPS) { cout << "NIE\n"; return; } cout << "TAK\n"; } int main() { ios::sync_with_stdio(0); cin.tie(0); int T; cin >> T; while(T --> 0) 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 | //Author: Piotr Zielinski #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, long double> PII; const int N = 2e3+5; long double EPS = 0.0000001; void solve() { int n, l, a, b; LL sumSrc = 0, sumDest = 0; cin >> n; vector<PII> src(n); vector<PII> dest(n); queue<PII> Q; for(int i = 0;i < n;++i) { cin >> l >> a >> b; src[i] = {a, l}; dest[i] = {b, l}; sumSrc += 1LL*l*a; sumDest += 1LL*l*b; } if(sumSrc != sumDest) { cout << "NIE\n"; return; } sort(src.begin(), src.end()); sort(dest.begin(), dest.end()); if(src[0].first > dest[0].first || src.back().first < dest.back().first) { cout << "NIE\n"; return; } int destCt = 0; a = 0, b = 0; while(b < n && destCt < n) { if(src[b].second <= EPS) { ++b; continue; } if(dest[destCt].first == src[b].first) { if(src[b].second < dest[destCt].second) { dest[destCt].second -= src[b].second; src[b].second = 0.0; ++b; continue; } src[b].second -= dest[destCt].second; ++destCt; continue; } if(dest[destCt].first+EPS >=src[b].first) { Q.push(src[b]); ++b; continue; } if(Q.empty()) { cout << "NIE\n"; return; } PII past = Q.front(); Q.pop(); long double x = (dest[destCt].second * (dest[destCt].first-src[b].first)) / (past.first - src[b].first); long double y = (dest[destCt].second * (past.first-dest[destCt].first)) / (past.first - src[b].first); if(past.second+EPS >= x && src[b].second+EPS >= y) { past.second -= x; src[b].second -= y; ++destCt; if(past.second > EPS) Q.push(past); //cout << "1 case" << endl; continue; } else if((past.second*(dest[destCt].first-past.first)) / (src[b].first-dest[destCt].first) <= src[b].second+EPS) { src[b].second -= (past.second*(dest[destCt].first-past.first)) / (src[b].first-dest[destCt].first); dest[destCt].second -= (past.second*(src[b].first-past.first)) / (src[b].first-dest[destCt].first); //cout << "2 case" << endl; continue; //cout << "AAAA " << x << " " << y << " " << src[a+2].second << " " << (x*(dest[destCt].first-src[a+1].first)) / (src[b].first-dest[destCt].first) << endl; } else { past.second -= (src[b].second*(dest[destCt].first-src[b].first)) / (past.first-dest[destCt].first); dest[destCt].second -= (src[b].second*(past.first-src[b].first)) / (past.first-dest[destCt].first); if(past.second > EPS) Q.push(past); ++b; //cout << "3 case" << endl; continue; } } //cout << a << " " << b <<" " << destCt << endl; if(destCt < n && dest[destCt].second > EPS) { cout << "NIE\n"; return; } cout << "TAK\n"; } int main() { ios::sync_with_stdio(0); cin.tie(0); int T; cin >> T; while(T --> 0) solve(); return 0; } |