#include <bits/stdc++.h> #define ll long long int #define mp make_pair #define pb push_back #define ld long double #define pa pair<int,int> #define st first #define nd second #define vi vector<int> #define BOOST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //#pragma GCC target ("avx2") //#pragma GCC optimization ("O3") //#pragma GCC optimization ("unroll-loops") using namespace std; const int MAX=100005; const ll inf=1e18+9; ll l[MAX],a[MAX],b[MAX]; ll sum1=0,sum2=0,akt1=0,akt2=0; pair<ll,ll>tab1[MAX],tab2[MAX],tab3[MAX],tab4[MAX]; bool minimum(int n) { int wskaznik=1; for (int i=1;i<=n;i++) { akt1+=tab3[i].nd; sum1+=tab3[i].st*tab3[i].nd; while (wskaznik<=n) { //cout<<"TERAZ "<<akt1<<" "<<akt2<<"\n"; if (akt1-akt2<=tab4[wskaznik].nd) { tab4[wskaznik].nd-=(akt1-akt2); sum2+=(akt1-akt2)*tab4[wskaznik].st; akt2+=akt1-akt2; break; } else { sum2+=tab4[wskaznik].st*tab4[wskaznik].nd; akt2+=tab4[wskaznik].nd; wskaznik++; } } //cout<<"NOW "<<sum1<<" "<<sum2<<"\n"; if (sum2<sum1) { return false; } } return true; } bool maximum(int n) { int wskaznik=n; for (int i=n;i>=1;i--) { akt1+=tab1[i].nd; sum1+=tab1[i].st*tab1[i].nd; while (wskaznik>=1) { //cout<<"TERAZ "<<akt1<<" "<<akt2<<"\n"; if (akt1-akt2<=tab2[wskaznik].nd) { tab2[wskaznik].nd-=(akt1-akt2); sum2+=(akt1-akt2)*tab2[wskaznik].st; akt2+=akt1-akt2; break; } else { sum2+=tab2[wskaznik].st*tab2[wskaznik].nd; akt2+=tab2[wskaznik].nd; wskaznik--; } } // cout<<"NOW "<<sum1<<" "<<sum2<<"\n"; if (sum2>sum1) { return false; } } return true; } int main() { BOOST; int t; cin>>t; for (int z=0;z<t;z++) { bool t=true; int n; cin>>n; sum1=0,sum2=0; for (int i=1;i<=n;i++) { cin>>l[i]>>a[i]>>b[i]; sum1+=l[i]*a[i]; sum2+=l[i]*b[i]; tab1[i]=mp(a[i],l[i]); tab2[i]=mp(b[i],l[i]); tab3[i]=mp(a[i],l[i]); tab4[i]=mp(b[i],l[i]); } if (sum1!=sum2) { t=false; } sum1=0,sum2=0,akt1=0,akt2=0; sort(tab1+1,tab1+n+1); sort(tab2+1,tab2+n+1); sort(tab3+1,tab3+n+1); sort(tab4+1,tab4+n+1); if (t)t=minimum(n); akt1=0,akt2=0,sum1=0,sum2=0; if (t)t=maximum(n); if (t)cout<<"TAK\n"; else cout<<"NIE\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 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 127 128 129 | #include <bits/stdc++.h> #define ll long long int #define mp make_pair #define pb push_back #define ld long double #define pa pair<int,int> #define st first #define nd second #define vi vector<int> #define BOOST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //#pragma GCC target ("avx2") //#pragma GCC optimization ("O3") //#pragma GCC optimization ("unroll-loops") using namespace std; const int MAX=100005; const ll inf=1e18+9; ll l[MAX],a[MAX],b[MAX]; ll sum1=0,sum2=0,akt1=0,akt2=0; pair<ll,ll>tab1[MAX],tab2[MAX],tab3[MAX],tab4[MAX]; bool minimum(int n) { int wskaznik=1; for (int i=1;i<=n;i++) { akt1+=tab3[i].nd; sum1+=tab3[i].st*tab3[i].nd; while (wskaznik<=n) { //cout<<"TERAZ "<<akt1<<" "<<akt2<<"\n"; if (akt1-akt2<=tab4[wskaznik].nd) { tab4[wskaznik].nd-=(akt1-akt2); sum2+=(akt1-akt2)*tab4[wskaznik].st; akt2+=akt1-akt2; break; } else { sum2+=tab4[wskaznik].st*tab4[wskaznik].nd; akt2+=tab4[wskaznik].nd; wskaznik++; } } //cout<<"NOW "<<sum1<<" "<<sum2<<"\n"; if (sum2<sum1) { return false; } } return true; } bool maximum(int n) { int wskaznik=n; for (int i=n;i>=1;i--) { akt1+=tab1[i].nd; sum1+=tab1[i].st*tab1[i].nd; while (wskaznik>=1) { //cout<<"TERAZ "<<akt1<<" "<<akt2<<"\n"; if (akt1-akt2<=tab2[wskaznik].nd) { tab2[wskaznik].nd-=(akt1-akt2); sum2+=(akt1-akt2)*tab2[wskaznik].st; akt2+=akt1-akt2; break; } else { sum2+=tab2[wskaznik].st*tab2[wskaznik].nd; akt2+=tab2[wskaznik].nd; wskaznik--; } } // cout<<"NOW "<<sum1<<" "<<sum2<<"\n"; if (sum2>sum1) { return false; } } return true; } int main() { BOOST; int t; cin>>t; for (int z=0;z<t;z++) { bool t=true; int n; cin>>n; sum1=0,sum2=0; for (int i=1;i<=n;i++) { cin>>l[i]>>a[i]>>b[i]; sum1+=l[i]*a[i]; sum2+=l[i]*b[i]; tab1[i]=mp(a[i],l[i]); tab2[i]=mp(b[i],l[i]); tab3[i]=mp(a[i],l[i]); tab4[i]=mp(b[i],l[i]); } if (sum1!=sum2) { t=false; } sum1=0,sum2=0,akt1=0,akt2=0; sort(tab1+1,tab1+n+1); sort(tab2+1,tab2+n+1); sort(tab3+1,tab3+n+1); sort(tab4+1,tab4+n+1); if (t)t=minimum(n); akt1=0,akt2=0,sum1=0,sum2=0; if (t)t=maximum(n); if (t)cout<<"TAK\n"; else cout<<"NIE\n"; } return 0; } |