#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool sprawdz_mozliwosc(vector<int>& sekwencja) {
int n = sekwencja.size();
if (all_of(sekwencja.begin(), sekwencja.end(), [](int x) { return x == 0; })) {
return true;
}
int max_val = *max_element(sekwencja.begin(), sekwencja.end());
vector<int> max_indices;
for (int i = 0; i < n; i++) {
if (sekwencja[i] == max_val) {
max_indices.push_back(i);
}
}
for (int i = 1; i < max_indices.size(); i++) {
if (max_indices[i] != max_indices[i - 1] + 1) {
return false;
}
}
int suma_pozostalych = 0;
for (int i = 0; i < n; i++) {
if (sekwencja[i] != max_val) {
suma_pozostalych += sekwencja[i];
}
}
if (max_val > suma_pozostalych + 1) {
return false;
}
while (true) {
int index_max = max_element(sekwencja.begin(), sekwencja.end()) - sekwencja.begin();
sekwencja[index_max]--;
if (all_of(sekwencja.begin(), sekwencja.end(), [](int x) { return x == 0; })) {
return true;
}
int lewy = (index_max > 0) ? index_max - 1 : -1;
int prawy = (index_max < n - 1) ? index_max + 1 : -1;
if (lewy != -1 && prawy != -1) {
index_max = (sekwencja[lewy] >= sekwencja[prawy]) ? lewy : prawy;
} else if (lewy != -1) {
index_max = lewy;
} else if (prawy != -1) {
index_max = prawy;
} else {
return false;
}
if (sekwencja[index_max] == 0) return false;
}
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> sekwencja(n);
for (int i = 0; i < n; i++) {
cin >> sekwencja[i];
}
if (n == 1) {
cout << (sekwencja[0] == 1 ? "TAK" : "NIE") << endl;
continue;
}
cout << (sprawdz_mozliwosc(sekwencja) ? "TAK" : "NIE") << endl;
}
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 78 79 80 81 82 83 84 85 86 | #include <iostream> #include <vector> #include <algorithm> using namespace std; bool sprawdz_mozliwosc(vector<int>& sekwencja) { int n = sekwencja.size(); if (all_of(sekwencja.begin(), sekwencja.end(), [](int x) { return x == 0; })) { return true; } int max_val = *max_element(sekwencja.begin(), sekwencja.end()); vector<int> max_indices; for (int i = 0; i < n; i++) { if (sekwencja[i] == max_val) { max_indices.push_back(i); } } for (int i = 1; i < max_indices.size(); i++) { if (max_indices[i] != max_indices[i - 1] + 1) { return false; } } int suma_pozostalych = 0; for (int i = 0; i < n; i++) { if (sekwencja[i] != max_val) { suma_pozostalych += sekwencja[i]; } } if (max_val > suma_pozostalych + 1) { return false; } while (true) { int index_max = max_element(sekwencja.begin(), sekwencja.end()) - sekwencja.begin(); sekwencja[index_max]--; if (all_of(sekwencja.begin(), sekwencja.end(), [](int x) { return x == 0; })) { return true; } int lewy = (index_max > 0) ? index_max - 1 : -1; int prawy = (index_max < n - 1) ? index_max + 1 : -1; if (lewy != -1 && prawy != -1) { index_max = (sekwencja[lewy] >= sekwencja[prawy]) ? lewy : prawy; } else if (lewy != -1) { index_max = lewy; } else if (prawy != -1) { index_max = prawy; } else { return false; } if (sekwencja[index_max] == 0) return false; } } int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> sekwencja(n); for (int i = 0; i < n; i++) { cin >> sekwencja[i]; } if (n == 1) { cout << (sekwencja[0] == 1 ? "TAK" : "NIE") << endl; continue; } cout << (sprawdz_mozliwosc(sekwencja) ? "TAK" : "NIE") << endl; } return 0; } |
English