#include <bits/stdc++.h> using namespace std; #define ll long long const int MAX = 100002; int N; pair<ll, ll> in[MAX]; pair<ll, ll> out[MAX]; void input(){ cin >> N; int l, a, b; for(int i = 0; i < N; i++){ cin >> l >> a >> b; in[i] = make_pair(a, l); out[i] = make_pair(b, l); } } bool check(){ long long s = 0; for(int i = 0; i < N; i++){ s += in[i].first * in[i].second; s -= out[i].first * out[i].second; } return s == 0; } bool process(){ sort(in, in + N); sort(out, out + N); for(int i = 0; i < N - 1; i++){ if(in[i].first == in[i + 1].first){ in[i + 1].second += in[i].second; in[i].second = 0; } if(out[i].first == out[i + 1].first){ out[i + 1].second += out[i].second; out[i].second = 0; } } int ind_out = N - 1; long long E = in[N - 1].first * in[N - 1].second; long long L = in[N - 1].second; for(int i = N - 2; i >= 0; i--){ if(ind_out >= 0 && E < L * out[ind_out].first){ //cout << "tutaj E = " << E << " L = " << L << endl; return false; } long long dE = in[i].first * in[i].second; long long dL = in[i].second; while(ind_out >= 0 && E + dE <= (L + dL) * out[ind_out].first){ if(L + dL == 0){ break; } //cout << "i = " << i << " ind_out = " << ind_out << " E = " << E << " L = " << L << " dE = " << dE << " dL = " << dL << endl; //cout << "x = " << out[ind_out].first << " y = " << out[ind_out].second << " " << endl; if(dE == out[ind_out].first * dL){ if(L + dL >= out[ind_out].second){ E -= out[ind_out].first * out[ind_out].second; L -= out[ind_out].second; ind_out--; } else { return false; } } else { if(dL * (out[ind_out].first*L - E) <= (out[ind_out].second - L)*(dE - out[ind_out].first * dL)){ E -= out[ind_out].first * out[ind_out].second; L -= out[ind_out].second; ind_out--; } else { return false; } } } E += dE; L += dL; } /* for(int ind_in = N - 1; ind_in >= 0; ind_in--){ cout << "ind_in = " << ind_in << " ind_out = " << ind_out << " E = " << E << endl; while(ind_out >= 0 && out[ind_out].first > in[ind_in].first){ E -= out[ind_out].first * out[ind_out].second; if(E < 0){ cout << "error: " << ind_out << endl; return false; } ind_out--; } E += in[ind_in].first * in[ind_in].second; } */ return true; } int main(){ cin.tie(NULL); ios_base::sync_with_stdio(0); int T; cin >> T; for(int v = 0; v < T; v++){ input(); if(check()){ if(process()){ cout << "TAK" << endl; } else { cout << "NIE" << endl; } } else { cout << "NIE" << endl; } } }
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 | #include <bits/stdc++.h> using namespace std; #define ll long long const int MAX = 100002; int N; pair<ll, ll> in[MAX]; pair<ll, ll> out[MAX]; void input(){ cin >> N; int l, a, b; for(int i = 0; i < N; i++){ cin >> l >> a >> b; in[i] = make_pair(a, l); out[i] = make_pair(b, l); } } bool check(){ long long s = 0; for(int i = 0; i < N; i++){ s += in[i].first * in[i].second; s -= out[i].first * out[i].second; } return s == 0; } bool process(){ sort(in, in + N); sort(out, out + N); for(int i = 0; i < N - 1; i++){ if(in[i].first == in[i + 1].first){ in[i + 1].second += in[i].second; in[i].second = 0; } if(out[i].first == out[i + 1].first){ out[i + 1].second += out[i].second; out[i].second = 0; } } int ind_out = N - 1; long long E = in[N - 1].first * in[N - 1].second; long long L = in[N - 1].second; for(int i = N - 2; i >= 0; i--){ if(ind_out >= 0 && E < L * out[ind_out].first){ //cout << "tutaj E = " << E << " L = " << L << endl; return false; } long long dE = in[i].first * in[i].second; long long dL = in[i].second; while(ind_out >= 0 && E + dE <= (L + dL) * out[ind_out].first){ if(L + dL == 0){ break; } //cout << "i = " << i << " ind_out = " << ind_out << " E = " << E << " L = " << L << " dE = " << dE << " dL = " << dL << endl; //cout << "x = " << out[ind_out].first << " y = " << out[ind_out].second << " " << endl; if(dE == out[ind_out].first * dL){ if(L + dL >= out[ind_out].second){ E -= out[ind_out].first * out[ind_out].second; L -= out[ind_out].second; ind_out--; } else { return false; } } else { if(dL * (out[ind_out].first*L - E) <= (out[ind_out].second - L)*(dE - out[ind_out].first * dL)){ E -= out[ind_out].first * out[ind_out].second; L -= out[ind_out].second; ind_out--; } else { return false; } } } E += dE; L += dL; } /* for(int ind_in = N - 1; ind_in >= 0; ind_in--){ cout << "ind_in = " << ind_in << " ind_out = " << ind_out << " E = " << E << endl; while(ind_out >= 0 && out[ind_out].first > in[ind_in].first){ E -= out[ind_out].first * out[ind_out].second; if(E < 0){ cout << "error: " << ind_out << endl; return false; } ind_out--; } E += in[ind_in].first * in[ind_in].second; } */ return true; } int main(){ cin.tie(NULL); ios_base::sync_with_stdio(0); int T; cin >> T; for(int v = 0; v < T; v++){ input(); if(check()){ if(process()){ cout << "TAK" << endl; } else { cout << "NIE" << endl; } } else { cout << "NIE" << endl; } } } |