#include <cstdio>
#include <set>
#include <vector>
constexpr auto CONSUME_ZERO_SS = 0;
constexpr auto CONSUME_ONE_SS = 1;
constexpr auto CONSUME_TWO_SS = 2;
using Buffer = std::set<int>;
void add(Buffer& dst, const Buffer& src, const int& dstValue, const int& minimalValue) {
for (const auto& v : src) {
if (minimalValue <= dstValue - v) {
dst.insert(dstValue - v);
}
}
}
void process(Buffer* buffers, Buffer* tmpBuffers, const int value) {
add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_TWO_SS], 2 * value, 0);
add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_ONE_SS], 2 * value - 1, 0);
add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_ZERO_SS], 2 * value - 2, 0);
add(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ONE_SS], 2 * value, 1);
add(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ZERO_SS], 2 * value - 1, 1);
add(tmpBuffers[CONSUME_ZERO_SS], buffers[CONSUME_ZERO_SS], 2 * value, 2);
std::swap(tmpBuffers[CONSUME_ZERO_SS], buffers[CONSUME_ZERO_SS]);
std::swap(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ONE_SS]);
std::swap(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_TWO_SS]);
}
bool isOk(const std::vector<int>& values) {
Buffer buffers[3];
Buffer tmpBuffers[3];
int nonZeroBlocks = 0;
int lastValue = 0;
bool initialized = false;
for (const auto& value : values) {
if (value != 0) {
if (lastValue == 0) {
nonZeroBlocks++;
}
if (1 < nonZeroBlocks) {
return false;
}
if (initialized) {
buffers[CONSUME_TWO_SS].erase(0);
process(buffers, tmpBuffers, value);
tmpBuffers[CONSUME_TWO_SS].clear();
tmpBuffers[CONSUME_ONE_SS].clear();
tmpBuffers[CONSUME_ZERO_SS].clear();
} else {
initialized = true;
buffers[CONSUME_TWO_SS].insert(value * 2 - 2);
buffers[CONSUME_ONE_SS].insert(value * 2 - 1);
buffers[CONSUME_ZERO_SS].insert(value * 2);
}
}
lastValue = value;
}
return 0 < buffers[CONSUME_TWO_SS].count(0);
}
int main() {
int t, n, value;
scanf("%d", &t);
for (int i = 0; i < t; ++i) {
scanf("%d", &n);
std::vector<int> values;
for (int j = 0; j < n; ++j) {
scanf("%d", &value);
values.push_back(value);
}
isOk(values) ? printf("TAK\n") : printf("NIE\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 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <cstdio> #include <set> #include <vector> constexpr auto CONSUME_ZERO_SS = 0; constexpr auto CONSUME_ONE_SS = 1; constexpr auto CONSUME_TWO_SS = 2; using Buffer = std::set<int>; void add(Buffer& dst, const Buffer& src, const int& dstValue, const int& minimalValue) { for (const auto& v : src) { if (minimalValue <= dstValue - v) { dst.insert(dstValue - v); } } } void process(Buffer* buffers, Buffer* tmpBuffers, const int value) { add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_TWO_SS], 2 * value, 0); add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_ONE_SS], 2 * value - 1, 0); add(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_ZERO_SS], 2 * value - 2, 0); add(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ONE_SS], 2 * value, 1); add(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ZERO_SS], 2 * value - 1, 1); add(tmpBuffers[CONSUME_ZERO_SS], buffers[CONSUME_ZERO_SS], 2 * value, 2); std::swap(tmpBuffers[CONSUME_ZERO_SS], buffers[CONSUME_ZERO_SS]); std::swap(tmpBuffers[CONSUME_ONE_SS], buffers[CONSUME_ONE_SS]); std::swap(tmpBuffers[CONSUME_TWO_SS], buffers[CONSUME_TWO_SS]); } bool isOk(const std::vector<int>& values) { Buffer buffers[3]; Buffer tmpBuffers[3]; int nonZeroBlocks = 0; int lastValue = 0; bool initialized = false; for (const auto& value : values) { if (value != 0) { if (lastValue == 0) { nonZeroBlocks++; } if (1 < nonZeroBlocks) { return false; } if (initialized) { buffers[CONSUME_TWO_SS].erase(0); process(buffers, tmpBuffers, value); tmpBuffers[CONSUME_TWO_SS].clear(); tmpBuffers[CONSUME_ONE_SS].clear(); tmpBuffers[CONSUME_ZERO_SS].clear(); } else { initialized = true; buffers[CONSUME_TWO_SS].insert(value * 2 - 2); buffers[CONSUME_ONE_SS].insert(value * 2 - 1); buffers[CONSUME_ZERO_SS].insert(value * 2); } } lastValue = value; } return 0 < buffers[CONSUME_TWO_SS].count(0); } int main() { int t, n, value; scanf("%d", &t); for (int i = 0; i < t; ++i) { scanf("%d", &n); std::vector<int> values; for (int j = 0; j < n; ++j) { scanf("%d", &value); values.push_back(value); } isOk(values) ? printf("TAK\n") : printf("NIE\n"); } return 0; } |
English