# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1004427 | aykhn | Trobojnica (COCI19_trobojnica) | C++17 | 352 ms | 51628 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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(x));
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 (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |