# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1004419 | 2024-06-21T08:47:27 Z | aykhn | Trobojnica (COCI19_trobojnica) | C++17 | 1 ms | 604 KB |
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; template<class T> using os = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define inf 0x3F3F3F3F3F3F3F3F const int MXN = 20 + 5; const int mod = 1e9 + 7; const int LOG = 20; int n; vector<array<int, 3>> res; os<array<int, 3>> s; queue<array<array<int, 3>, 2>> del[4]; int cnt[4]; int ok() { if (s.size() == 3) { return cnt[1] == 1 && cnt[2] == 1 && cnt[3] == 1; } if (max({cnt[1], cnt[2], cnt[3]}) == s.size()) { return 0; } int mx = 1; for (int i = 1; i <= 3; i++) if (cnt[i] > cnt[mx]) mx = i; while (!del[mx].empty()) { if (s.find(del[mx].front()[0]) == s.end() || s.find(del[mx].front()[1]) == s.end()) del[mx].pop(); else break; } assert(!del[mx].empty()); array<array<int, 3>, 2> d = del[mx].front(); del[mx].pop(); s.erase(d[0]); cnt[d[0][2]]--; s.erase(d[1]); cnt[d[1][2]]--; s.insert({d[0][0], d[1][1], 6 - d[0][2] - d[1][2]}); cnt[6 - d[0][2] - d[1][2]]++; auto x = s.find({d[0][0], d[1][1], 6 - d[0][2] - d[1][2]}); auto z = (x == s.begin() ? prev(s.end()) : prev(s.begin())); auto y = (next(x) == s.end() ? s.begin() : next(x)); array<int, 3> A = *z, B = *x, C = *y; if (A[2] != B[2]) { del[A[2]].push({A, B}); del[B[2]].push({A, B}); } if (B[2] != C[2]) { del[B[2]].push({B, C}); del[C[2]].push({B, C}); } if (ok()) { res.push_back({d[0][0], d[1][1], 6 - d[0][2] - d[1][2]}); return 1; } return 0; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; vector<array<int, 3>> v; for (int i = 0; i < n; i++) { char ch; cin >> ch; s.insert({i + 1, (i + 1) % n + 1, ch - '0'}); cnt[ch - '0']++; } for (auto x = s.begin(); x != s.end(); x++) { auto y = (next(x) == s.end() ? s.begin() : next(x)); if ((*x)[2] != (*y)[2]) del[(*x)[2]].push({*x, *y}); } if (cnt[3] % 2 != cnt[1] % 2 || cnt[3] % 2 != cnt[1] % 2 || cnt[1] % 2 != cnt[2] % 2) { cout << "NE\n"; return 0; } if (!ok()) cout << "NE\n"; else { cout << "DA\n"; for (array<int, 3> &x : res) cout << x[0] << ' ' << x[1] << ' ' << x[2] << '\n'; } }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 1 ms | 604 KB | Execution killed with signal 6 |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 1 ms | 604 KB | Execution killed with signal 6 |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 1 ms | 604 KB | Execution killed with signal 6 |
2 | Halted | 0 ms | 0 KB | - |