#include <cstdio> #include <vector> #include <unordered_set> using namespace std; unordered_set<int> possible_need[3], new_possible_need[3]; bool singleTest() { for (int K = 0; K < 3; K++) { possible_need[K].clear(); new_possible_need[K].clear(); } int n, x; scanf("%d", &n); vector<int> counts; bool zeroAfterNonzero = false; bool error = false; for (int i = 0; i < n; i++) { scanf("%d", &x); if (x != 0) { if (zeroAfterNonzero) { error = true; } counts.push_back(x * 2); } else { if (counts.size() > 0) { zeroAfterNonzero = true; } } } if (error) { return false; } if (counts.size() == 1) { return counts[0] == 2; } new_possible_need[0].insert(counts[0]); new_possible_need[1].insert(counts[0] - 1); new_possible_need[2].insert(counts[0] - 2); for (size_t i = 1; i < counts.size(); i++) { for (int K = 0; K < 3; K++) { swap(possible_need[K], new_possible_need[K]); new_possible_need[K].clear(); } int here = counts[i]; for (int in_K = 0; in_K < 3; in_K++) { for (int out_K = in_K; out_K < 3; out_K++) { int k_diff = out_K - in_K; for (int c : possible_need[in_K]) { if (c > 0 && here >= c + k_diff) { new_possible_need[out_K].insert(here - c - k_diff); } } } } } for (int c : new_possible_need[2]) { if (c == 0) { return true; } } return false; } int main() { int T; scanf("%d", &T); for (int i = 0; i < T; i++) { if (singleTest()) { printf("TAK\n"); } else { printf("NIE\n"); } } }
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 | #include <cstdio> #include <vector> #include <unordered_set> using namespace std; unordered_set<int> possible_need[3], new_possible_need[3]; bool singleTest() { for (int K = 0; K < 3; K++) { possible_need[K].clear(); new_possible_need[K].clear(); } int n, x; scanf("%d", &n); vector<int> counts; bool zeroAfterNonzero = false; bool error = false; for (int i = 0; i < n; i++) { scanf("%d", &x); if (x != 0) { if (zeroAfterNonzero) { error = true; } counts.push_back(x * 2); } else { if (counts.size() > 0) { zeroAfterNonzero = true; } } } if (error) { return false; } if (counts.size() == 1) { return counts[0] == 2; } new_possible_need[0].insert(counts[0]); new_possible_need[1].insert(counts[0] - 1); new_possible_need[2].insert(counts[0] - 2); for (size_t i = 1; i < counts.size(); i++) { for (int K = 0; K < 3; K++) { swap(possible_need[K], new_possible_need[K]); new_possible_need[K].clear(); } int here = counts[i]; for (int in_K = 0; in_K < 3; in_K++) { for (int out_K = in_K; out_K < 3; out_K++) { int k_diff = out_K - in_K; for (int c : possible_need[in_K]) { if (c > 0 && here >= c + k_diff) { new_possible_need[out_K].insert(here - c - k_diff); } } } } } for (int c : new_possible_need[2]) { if (c == 0) { return true; } } return false; } int main() { int T; scanf("%d", &T); for (int i = 0; i < T; i++) { if (singleTest()) { printf("TAK\n"); } else { printf("NIE\n"); } } } |