#include "bits/stdc++.h" using namespace std; #define rep(i,a,b) for(int i=(a); i<(b); ++i) #define all(x) x.begin(),x.end() #define sz(x) int(x.size()) typedef long long ll; typedef unsigned long long ull; void cmin(int& a, int b){ a = min(a,b); } void cmax(int& a, int b){ a = max(a,b); } const int N = 1e6+10; ll a[N], b[N]; bool calc(int l, int r){ rep(i,l,r) b[i-l] = a[i]; int n = r-l; rep(i,0,n-1){ if (b[i] < 0) return 0; b[i+1] -= b[i]; b[i] = 0; } return b[n-1] == 0; } void solve(){ int n; cin >> n; if (n==1){ int x; cin >> x; if (x == 1) cout << "TAK\n"; else cout << "NIE\n"; return; } if (n==2){ int x,y; cin >> x >> y; if (abs(x-y) < 2) cout << "TAK\n"; else cout << "NIE\n"; return; } rep(i,0,n) cin >> a[i]; int l = -1, r = -2; rep(i,0,n) { if (a[i] != 0 and l<0) l = i; if (a[i] != 0) r = i+1; } if (r < l){ cout << "NIE\n"; return; } rep(i,l,r) if (a[i] == 0){ cout << "NIE\n"; return; } if (r-l==1){ if (a[l] == 1) cout << "TAK\n"; else cout << "NIE\n"; return; } if (r-l == 2){ if (abs(a[l]-a[l+1]) > 1) cout << "NIE\n"; else cout << "TAK\n"; return; } bool good = 0; rep(i,l,r) a[i] -= 1; // eerste 4 if (!good){ good = calc(l,r); } if (!good){ a[l+1] -= 1; good = calc(l,r); } if (!good){ a[r-2] -= 1; good = calc(l,r); } if (!good){ a[l+1] += 1; good = calc(l,r); a[r-2] += 1; } // laatste opties rep(i,l+1,r-1) a[i] -= 1; if (!good){ a[l] -= 1; good = calc(l,r); a[l] += 1; } if (!good){ a[r-1] -= 1; good = calc(l,r); a[r-1] += 1; } cout << (good ? "TAK" : "NIE") << '\n'; } int32_t main(){ cin.tie(NULL),cin.sync_with_stdio(false); int t; cin >> t; while(t--) solve(); }
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 | #include "bits/stdc++.h" using namespace std; #define rep(i,a,b) for(int i=(a); i<(b); ++i) #define all(x) x.begin(),x.end() #define sz(x) int(x.size()) typedef long long ll; typedef unsigned long long ull; void cmin(int& a, int b){ a = min(a,b); } void cmax(int& a, int b){ a = max(a,b); } const int N = 1e6+10; ll a[N], b[N]; bool calc(int l, int r){ rep(i,l,r) b[i-l] = a[i]; int n = r-l; rep(i,0,n-1){ if (b[i] < 0) return 0; b[i+1] -= b[i]; b[i] = 0; } return b[n-1] == 0; } void solve(){ int n; cin >> n; if (n==1){ int x; cin >> x; if (x == 1) cout << "TAK\n"; else cout << "NIE\n"; return; } if (n==2){ int x,y; cin >> x >> y; if (abs(x-y) < 2) cout << "TAK\n"; else cout << "NIE\n"; return; } rep(i,0,n) cin >> a[i]; int l = -1, r = -2; rep(i,0,n) { if (a[i] != 0 and l<0) l = i; if (a[i] != 0) r = i+1; } if (r < l){ cout << "NIE\n"; return; } rep(i,l,r) if (a[i] == 0){ cout << "NIE\n"; return; } if (r-l==1){ if (a[l] == 1) cout << "TAK\n"; else cout << "NIE\n"; return; } if (r-l == 2){ if (abs(a[l]-a[l+1]) > 1) cout << "NIE\n"; else cout << "TAK\n"; return; } bool good = 0; rep(i,l,r) a[i] -= 1; // eerste 4 if (!good){ good = calc(l,r); } if (!good){ a[l+1] -= 1; good = calc(l,r); } if (!good){ a[r-2] -= 1; good = calc(l,r); } if (!good){ a[l+1] += 1; good = calc(l,r); a[r-2] += 1; } // laatste opties rep(i,l+1,r-1) a[i] -= 1; if (!good){ a[l] -= 1; good = calc(l,r); a[l] += 1; } if (!good){ a[r-1] -= 1; good = calc(l,r); a[r-1] += 1; } cout << (good ? "TAK" : "NIE") << '\n'; } int32_t main(){ cin.tie(NULL),cin.sync_with_stdio(false); int t; cin >> t; while(t--) solve(); } |