#include <bits/stdc++.h> #define x first #define y second using namespace std; using L = long long; using D = long double; const D EPS = 1e-6; pair<D, D> kub_st[100100], kub_en[100100]; int n, t; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> t; while(t--) { L checkSum1 = 0, checkSum2 = 0; cin >> n; for(int i = 0; i < n; ++i) { L l, a, b; cin >> l >> a >> b; checkSum1 += l * a; checkSum2 += l * b; kub_st[i] = {a, l}; kub_en[i] = {b, l}; } if(checkSum1 != checkSum2) { cout << "NIE\n"; continue; } sort(kub_st, kub_st + n, greater<pair<D, D>>()); sort(kub_en, kub_en + n, greater<pair<D, D>>()); /*for(int i = 0; i < n; ++i) { cout << kub_st[i].x << ' ' << kub_st[i].y << ' ' << kub_en[i].x << ' ' << kub_en[i].y << '\n'; }*/ int pgt = 0, plt = 0; bool doable = true; //int kebab = 0; for(int i = 0; i < n; ++i) { //cout << i << " :HMM\n"; while(doable) { //if(++kebab > 10) return 0; //cout << pgt << ' ' << plt << ' ' << kub_st[pgt].x << ' ' << kub_st[pgt].y << ' ' << kub_st[plt].x << ' ' << kub_st[plt].y << ' ' << kub_en[i].x << ' ' << kub_en[i].y << '\n'; if(kub_st[pgt].x == kub_en[i].x) { D g = min(kub_st[pgt].y, kub_en[i].y); kub_st[pgt].y -= g; kub_en[i].y -= g; } if(abs(kub_en[i].y) < EPS) break; if(abs(kub_st[pgt].y) < EPS) { ++pgt; if(pgt == n) doable = false; if(abs(kub_en[i].y) > EPS && kub_en[i].x > kub_st[pgt].x) doable = false; continue; } if(kub_st[pgt].x < kub_en[i].x) { doable = false; break; } while((kub_st[plt].x >= kub_en[i].x || abs(kub_st[plt].y) < EPS) && plt < n) { ++plt; } if(plt == n) { doable = false; break; } //cout << (kub_en[i].x - kub_st[plt].x) << ' ' << (kub_st[pgt].x - kub_st[plt].x) << '\n'; D percent = (kub_en[i].x - kub_st[plt].x) / (kub_st[pgt].x - kub_st[plt].x); D fA = kub_st[pgt].y / percent; D fB = kub_st[plt].y / (1.0 - percent); D fMin = min({fA, fB, kub_en[i].y}); kub_st[pgt].y -= fMin * percent; kub_st[plt].y -= fMin * (1.0 - percent); kub_en[i].y -= fMin; } if(!doable) break; } if(doable) cout << "TAK\n"; else cout << "NIE\n"; //cout << "NIEWIEM!\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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <bits/stdc++.h> #define x first #define y second using namespace std; using L = long long; using D = long double; const D EPS = 1e-6; pair<D, D> kub_st[100100], kub_en[100100]; int n, t; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> t; while(t--) { L checkSum1 = 0, checkSum2 = 0; cin >> n; for(int i = 0; i < n; ++i) { L l, a, b; cin >> l >> a >> b; checkSum1 += l * a; checkSum2 += l * b; kub_st[i] = {a, l}; kub_en[i] = {b, l}; } if(checkSum1 != checkSum2) { cout << "NIE\n"; continue; } sort(kub_st, kub_st + n, greater<pair<D, D>>()); sort(kub_en, kub_en + n, greater<pair<D, D>>()); /*for(int i = 0; i < n; ++i) { cout << kub_st[i].x << ' ' << kub_st[i].y << ' ' << kub_en[i].x << ' ' << kub_en[i].y << '\n'; }*/ int pgt = 0, plt = 0; bool doable = true; //int kebab = 0; for(int i = 0; i < n; ++i) { //cout << i << " :HMM\n"; while(doable) { //if(++kebab > 10) return 0; //cout << pgt << ' ' << plt << ' ' << kub_st[pgt].x << ' ' << kub_st[pgt].y << ' ' << kub_st[plt].x << ' ' << kub_st[plt].y << ' ' << kub_en[i].x << ' ' << kub_en[i].y << '\n'; if(kub_st[pgt].x == kub_en[i].x) { D g = min(kub_st[pgt].y, kub_en[i].y); kub_st[pgt].y -= g; kub_en[i].y -= g; } if(abs(kub_en[i].y) < EPS) break; if(abs(kub_st[pgt].y) < EPS) { ++pgt; if(pgt == n) doable = false; if(abs(kub_en[i].y) > EPS && kub_en[i].x > kub_st[pgt].x) doable = false; continue; } if(kub_st[pgt].x < kub_en[i].x) { doable = false; break; } while((kub_st[plt].x >= kub_en[i].x || abs(kub_st[plt].y) < EPS) && plt < n) { ++plt; } if(plt == n) { doable = false; break; } //cout << (kub_en[i].x - kub_st[plt].x) << ' ' << (kub_st[pgt].x - kub_st[plt].x) << '\n'; D percent = (kub_en[i].x - kub_st[plt].x) / (kub_st[pgt].x - kub_st[plt].x); D fA = kub_st[pgt].y / percent; D fB = kub_st[plt].y / (1.0 - percent); D fMin = min({fA, fB, kub_en[i].y}); kub_st[pgt].y -= fMin * percent; kub_st[plt].y -= fMin * (1.0 - percent); kub_en[i].y -= fMin; } if(!doable) break; } if(doable) cout << "TAK\n"; else cout << "NIE\n"; //cout << "NIEWIEM!\n"; } return 0; } |