#include<bits/stdc++.h> using namespace std; int tab[1000009], ile_sufix[1000009], powrot_sufix[1000009], powrot_prefix[1000009], ile_prefix[1000009]; void solve() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, a, gdzie, lewo, prawo; cin >> n; for(int i=0; i<=n+1; i++) { tab[i]=0; ile_sufix[i]=0; ile_prefix[i]=0; powrot_prefix[i]=0; powrot_sufix[i]=0; } for(int i=1; i<=n; i++) { cin >> tab[i]; if(tab[i]!=0) { gdzie=i; } } for(int i=gdzie; i>=0; i--) { if(tab[i]==0) { lewo=i+1; break; } } for(int i=gdzie; i<=n+1; i++) { if(tab[i]==0) { prawo=i-1; break; } } for(int i=1; i<=n; i++) { if(tab[i]!=0 && (i>prawo or i<lewo)) { cout << "NIE" << '\n'; return; } } // cout << tab[2] << endl; if(lewo==prawo) { if(tab[lewo]!=1) { cout << "NIE" << '\n'; return; } else { cout << "TAK" << '\n'; return; } } powrot_sufix[prawo]=1; ile_sufix[prawo]=tab[prawo]-1; int b; //cout << tab[2] << endl; for(int i=prawo-1; i>=lewo; i--) { if(powrot_sufix[i+1]==-1) { powrot_sufix[i]=-1; continue; } else if(powrot_sufix[i+1]==0) { a=tab[i]-1; b=ile_sufix[i+1]; powrot_sufix[i]=0; a-=b; if(a<0) { powrot_sufix[i]=-1; } else { ile_sufix[i]=a; } } else { //jest z powrotem w i+1 z wartoscia ile_sufix[i+1] a=tab[i]-1; b=ile_sufix[i+1]; if(a<b) { powrot_sufix[i]=-1; continue; } if(a==b) { powrot_sufix[i]=0; ile_sufix[i]=0; } else { a-=b; a--; ile_sufix[i]=a; powrot_sufix[i]=1; } } } //for(int i=lewo; i<=prawo; i++) { //cout << ile_sufix[i] << ' ' << powrot_sufix[i] << endl; //} ile_prefix[lewo]=tab[lewo]-1; powrot_prefix[lewo]=1; //cout << tab[2] << endl; for(int i=lewo+1; i<=prawo; i++) { if(powrot_prefix[i-1]==-1) { powrot_prefix[i]=-1; continue; } else if(powrot_prefix[i-1]==0) { a=tab[i]-1; b=ile_prefix[i-1]; powrot_prefix[i]=0; a-=b; if(a<0) { powrot_prefix[i]=-1; } else { ile_prefix[i]=a; } } else { //jest z powrotem w i+1 z wartoscia ile_sufix[i+1] a=tab[i]-1; b=ile_prefix[i-1]; if(a<b) { powrot_prefix[i]=-1; continue; } if(a==b) { powrot_prefix[i]=0; ile_prefix[i]=0; } else { a-=b; a--; ile_prefix[i]=a; powrot_prefix[i]=1; } } } //cout << tab[2] << endl; bool czy=0; //cout << ile_prefix[1] << ' ' << powrot_prefix[1] << endl; //cout << ile_sufix[3] << ' ' << powrot_sufix[3] << endl; for(int i=lewo+1; i<prawo; i++) { //pierw w prawo pozniej lewo if(powrot_sufix[i+1]==1 && powrot_prefix[i-1]!=-1) { //cout << "JEST" << endl; //mozna w prawo i wrocic b=ile_sufix[i+1]; a=tab[i]-1-b-1; //cout << i << endl; // cout << tab[i] << ' ' << b << endl; //cout << a << ' ' << b << endl; if(a>=0) { if(powrot_prefix[i-1]==1) { //cout << "XD" << endl; if(a==ile_prefix[i-1] or a==ile_prefix[i-1]+1) { czy=1; } } else { a-=(ile_prefix[i-1]); if(a==0) { czy=1; } } } } if(powrot_prefix[i-1]==1 && powrot_sufix[i+1]!=-1) { b=ile_prefix[i-1]; //cout << "JEST" << endl; a=tab[i]-1-b-1; if(a>=0) { if(powrot_sufix[i+1]==1) { if(a==ile_sufix[i+1] or a==ile_sufix[i+1]+1) { czy=1; } } else { a-=(ile_sufix[i+1]); if(a==0) { czy=1; } } } } } //cout << ile_prefix[1] << ' ' << powrot_prefix[1] << endl; //cout << ile_sufix[3] << ' ' << powrot_sufix[3] << endl; if(powrot_sufix[lewo]!=-1 && ile_sufix[lewo]==0) { czy=1; } if(powrot_prefix[prawo]!=-1 && ile_prefix[prawo]==0) { czy=1; } if(czy) { cout << "TAK" << '\n'; } else { cout << "NIE" << '\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; for(int i=1; i<=t; i++) { solve(); } } /* 1 5 1 2 1 2 1 */
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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | #include<bits/stdc++.h> using namespace std; int tab[1000009], ile_sufix[1000009], powrot_sufix[1000009], powrot_prefix[1000009], ile_prefix[1000009]; void solve() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, a, gdzie, lewo, prawo; cin >> n; for(int i=0; i<=n+1; i++) { tab[i]=0; ile_sufix[i]=0; ile_prefix[i]=0; powrot_prefix[i]=0; powrot_sufix[i]=0; } for(int i=1; i<=n; i++) { cin >> tab[i]; if(tab[i]!=0) { gdzie=i; } } for(int i=gdzie; i>=0; i--) { if(tab[i]==0) { lewo=i+1; break; } } for(int i=gdzie; i<=n+1; i++) { if(tab[i]==0) { prawo=i-1; break; } } for(int i=1; i<=n; i++) { if(tab[i]!=0 && (i>prawo or i<lewo)) { cout << "NIE" << '\n'; return; } } // cout << tab[2] << endl; if(lewo==prawo) { if(tab[lewo]!=1) { cout << "NIE" << '\n'; return; } else { cout << "TAK" << '\n'; return; } } powrot_sufix[prawo]=1; ile_sufix[prawo]=tab[prawo]-1; int b; //cout << tab[2] << endl; for(int i=prawo-1; i>=lewo; i--) { if(powrot_sufix[i+1]==-1) { powrot_sufix[i]=-1; continue; } else if(powrot_sufix[i+1]==0) { a=tab[i]-1; b=ile_sufix[i+1]; powrot_sufix[i]=0; a-=b; if(a<0) { powrot_sufix[i]=-1; } else { ile_sufix[i]=a; } } else { //jest z powrotem w i+1 z wartoscia ile_sufix[i+1] a=tab[i]-1; b=ile_sufix[i+1]; if(a<b) { powrot_sufix[i]=-1; continue; } if(a==b) { powrot_sufix[i]=0; ile_sufix[i]=0; } else { a-=b; a--; ile_sufix[i]=a; powrot_sufix[i]=1; } } } //for(int i=lewo; i<=prawo; i++) { //cout << ile_sufix[i] << ' ' << powrot_sufix[i] << endl; //} ile_prefix[lewo]=tab[lewo]-1; powrot_prefix[lewo]=1; //cout << tab[2] << endl; for(int i=lewo+1; i<=prawo; i++) { if(powrot_prefix[i-1]==-1) { powrot_prefix[i]=-1; continue; } else if(powrot_prefix[i-1]==0) { a=tab[i]-1; b=ile_prefix[i-1]; powrot_prefix[i]=0; a-=b; if(a<0) { powrot_prefix[i]=-1; } else { ile_prefix[i]=a; } } else { //jest z powrotem w i+1 z wartoscia ile_sufix[i+1] a=tab[i]-1; b=ile_prefix[i-1]; if(a<b) { powrot_prefix[i]=-1; continue; } if(a==b) { powrot_prefix[i]=0; ile_prefix[i]=0; } else { a-=b; a--; ile_prefix[i]=a; powrot_prefix[i]=1; } } } //cout << tab[2] << endl; bool czy=0; //cout << ile_prefix[1] << ' ' << powrot_prefix[1] << endl; //cout << ile_sufix[3] << ' ' << powrot_sufix[3] << endl; for(int i=lewo+1; i<prawo; i++) { //pierw w prawo pozniej lewo if(powrot_sufix[i+1]==1 && powrot_prefix[i-1]!=-1) { //cout << "JEST" << endl; //mozna w prawo i wrocic b=ile_sufix[i+1]; a=tab[i]-1-b-1; //cout << i << endl; // cout << tab[i] << ' ' << b << endl; //cout << a << ' ' << b << endl; if(a>=0) { if(powrot_prefix[i-1]==1) { //cout << "XD" << endl; if(a==ile_prefix[i-1] or a==ile_prefix[i-1]+1) { czy=1; } } else { a-=(ile_prefix[i-1]); if(a==0) { czy=1; } } } } if(powrot_prefix[i-1]==1 && powrot_sufix[i+1]!=-1) { b=ile_prefix[i-1]; //cout << "JEST" << endl; a=tab[i]-1-b-1; if(a>=0) { if(powrot_sufix[i+1]==1) { if(a==ile_sufix[i+1] or a==ile_sufix[i+1]+1) { czy=1; } } else { a-=(ile_sufix[i+1]); if(a==0) { czy=1; } } } } } //cout << ile_prefix[1] << ' ' << powrot_prefix[1] << endl; //cout << ile_sufix[3] << ' ' << powrot_sufix[3] << endl; if(powrot_sufix[lewo]!=-1 && ile_sufix[lewo]==0) { czy=1; } if(powrot_prefix[prawo]!=-1 && ile_prefix[prawo]==0) { czy=1; } if(czy) { cout << "TAK" << '\n'; } else { cout << "NIE" << '\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; for(int i=1; i<=t; i++) { solve(); } } /* 1 5 1 2 1 2 1 */ |