#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
using ld = long double;
//#define int ll
#define sz(x) ((int)(x).size())
using pii = pair<int,int>;
using tii = tuple<int,int,int>;
void testcase() {
vector<int> s, v;
int n;
cin >> n;
v.resize(n);
for(auto &x : v) cin >> x;
while(sz(v) && v.back() == 0) v.pop_back();
reverse(all(v));
while(sz(v) && v.back() == 0) v.pop_back();
reverse(all(v));
if(sz(v) == 0) { cout << "TAK\n"; return; }
for(auto &x :v) if(x == 0) { cout << "NIE\n"; return; } // conditie triviala de disconectivitate (cred ca ar fi oricum verificata din chestiile de mai jos dar idfk detest jegul asta)
n = sz(v);
for(auto &x : v) x *= 2; // ca defapt alea-s gradele sau cv
for(int i = 0; i < n; i++)
s.emplace_back(s.empty()? v[i] : (i % 2? -1 : 1) * v[i] + s.back());
if(abs(s.back()) > 2) { cout << "NIE\n"; return; } // nu poti scadea suma mai tare de atat??
for(int i = 1; i < n - 1; i++)
if(s[i] != 0 && s[i - 1] != 0 && (ll)s[i] * s[i - 1] > 0) { cout << "NIE\n"; return; } // nu se paseaza nimic mai departe din partea aluia din fata sau cv de genul
// acuma eu daca dau cv gen 000++++000 nu se schimba prea tare cat de pozitive is si gen chestia asta e inerta decat pt 0uri:
int firstzero = -1;
bool canneg = 1, canpoz = 1;
for(int i = 1; i < n - 1; i++) {
if(s[i] == 0) {
if(firstzero == -1) firstzero = i;
if(s[i - 1] == 0 || s[i + 1] == 0) { cout << "NIE\n"; return; } // ????
if((ll)s[i - 1] * s[i + 1] < 0) { cout << "NIE\n"; return; } // oricum il fac nu il repar
if(s[i - 1] > 0) canpoz = 0;
else canneg = 0;
}
}
if(!canpoz && !canneg) { cout << "NIE\n"; return; }
if(firstzero == -1) { cout << "TAK\n"; return; }
if(s.back() == 0) { cout << "TAK\n"; return; } // ca gen, pot sa scad dinaintea primului delimitator si sa adun dupa ultimul si ele exista (ca trb fiecare valoare sa fie egala cu semnul ei)
if(canneg && s.back() == 2) { cout << "TAK\n"; return; }
if(canpoz && s.back() == -2) { cout << "TAK\n"; return; }
cout << "NIE\n"; return; // adica ar trb at this point sa pot oricum???
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
int T;
cin >> T;
while(T--) testcase();
}
/**
Binecuvanteaza Doamne Ukraina.
--
*/
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 | #include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; void testcase() { vector<int> s, v; int n; cin >> n; v.resize(n); for(auto &x : v) cin >> x; while(sz(v) && v.back() == 0) v.pop_back(); reverse(all(v)); while(sz(v) && v.back() == 0) v.pop_back(); reverse(all(v)); if(sz(v) == 0) { cout << "TAK\n"; return; } for(auto &x :v) if(x == 0) { cout << "NIE\n"; return; } // conditie triviala de disconectivitate (cred ca ar fi oricum verificata din chestiile de mai jos dar idfk detest jegul asta) n = sz(v); for(auto &x : v) x *= 2; // ca defapt alea-s gradele sau cv for(int i = 0; i < n; i++) s.emplace_back(s.empty()? v[i] : (i % 2? -1 : 1) * v[i] + s.back()); if(abs(s.back()) > 2) { cout << "NIE\n"; return; } // nu poti scadea suma mai tare de atat?? for(int i = 1; i < n - 1; i++) if(s[i] != 0 && s[i - 1] != 0 && (ll)s[i] * s[i - 1] > 0) { cout << "NIE\n"; return; } // nu se paseaza nimic mai departe din partea aluia din fata sau cv de genul // acuma eu daca dau cv gen 000++++000 nu se schimba prea tare cat de pozitive is si gen chestia asta e inerta decat pt 0uri: int firstzero = -1; bool canneg = 1, canpoz = 1; for(int i = 1; i < n - 1; i++) { if(s[i] == 0) { if(firstzero == -1) firstzero = i; if(s[i - 1] == 0 || s[i + 1] == 0) { cout << "NIE\n"; return; } // ???? if((ll)s[i - 1] * s[i + 1] < 0) { cout << "NIE\n"; return; } // oricum il fac nu il repar if(s[i - 1] > 0) canpoz = 0; else canneg = 0; } } if(!canpoz && !canneg) { cout << "NIE\n"; return; } if(firstzero == -1) { cout << "TAK\n"; return; } if(s.back() == 0) { cout << "TAK\n"; return; } // ca gen, pot sa scad dinaintea primului delimitator si sa adun dupa ultimul si ele exista (ca trb fiecare valoare sa fie egala cu semnul ei) if(canneg && s.back() == 2) { cout << "TAK\n"; return; } if(canpoz && s.back() == -2) { cout << "TAK\n"; return; } cout << "NIE\n"; return; // adica ar trb at this point sa pot oricum??? } signed main() { cin.tie(0) -> sync_with_stdio(0); int T; cin >> T; while(T--) testcase(); } /** Binecuvanteaza Doamne Ukraina. -- */ |
English