#include <iostream> #include <vector> struct InputData { unsigned n; std::vector<unsigned> toys; unsigned sum; } input_data; void parse_input() { std::cin >> input_data.n; input_data.toys.resize(input_data.n); input_data.sum = 0; for (unsigned i = 0; i < input_data.n; ++i) { std::cin >> input_data.toys[i]; input_data.sum += input_data.toys[i]; } } bool backtracking(const unsigned pos, std::vector<unsigned>& curr, const unsigned sum) { // std::cerr << "backtracking " << pos << ' ' << sum << '\n'; // check if done if (sum == 1) return true; // go left if (pos != 0 && curr[pos-1] != 0) { curr[pos]--; if (backtracking(pos-1, curr, sum-1)) return true; curr[pos]++; } // go right if (pos != input_data.n-1 && curr[pos+1] != 0) { curr[pos]--; if (backtracking(pos+1, curr, sum-1)) return true; curr[pos]++; } return false; } bool solve() { std::vector<unsigned> curr{input_data.toys}; for (unsigned i = 0; i < input_data.n; ++i) { if (curr[i] && backtracking(i, curr, input_data.sum)) return true; } return false; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); unsigned t; std::cin >> t; for (unsigned i = 0; i < t; ++i) { if (i % 100'000 == 0) std::cerr << i << '\n'; input_data = { 0 }; parse_input(); const auto res = solve() ? "TAK" : "NIE"; std::cout << res << '\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 | #include <iostream> #include <vector> struct InputData { unsigned n; std::vector<unsigned> toys; unsigned sum; } input_data; void parse_input() { std::cin >> input_data.n; input_data.toys.resize(input_data.n); input_data.sum = 0; for (unsigned i = 0; i < input_data.n; ++i) { std::cin >> input_data.toys[i]; input_data.sum += input_data.toys[i]; } } bool backtracking(const unsigned pos, std::vector<unsigned>& curr, const unsigned sum) { // std::cerr << "backtracking " << pos << ' ' << sum << '\n'; // check if done if (sum == 1) return true; // go left if (pos != 0 && curr[pos-1] != 0) { curr[pos]--; if (backtracking(pos-1, curr, sum-1)) return true; curr[pos]++; } // go right if (pos != input_data.n-1 && curr[pos+1] != 0) { curr[pos]--; if (backtracking(pos+1, curr, sum-1)) return true; curr[pos]++; } return false; } bool solve() { std::vector<unsigned> curr{input_data.toys}; for (unsigned i = 0; i < input_data.n; ++i) { if (curr[i] && backtracking(i, curr, input_data.sum)) return true; } return false; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); unsigned t; std::cin >> t; for (unsigned i = 0; i < t; ++i) { if (i % 100'000 == 0) std::cerr << i << '\n'; input_data = { 0 }; parse_input(); const auto res = solve() ? "TAK" : "NIE"; std::cout << res << '\n'; } return 0; } |