#include "meetings.h"
#include<bits/stdc++.h>
using namespace std;
#define st first
#define nd second
#define pb push_back
#define debug false
const int MAXN = 2000;
map<tuple<int, int, int>, pair<bool, int>> wyniki;
//mt19937 gen(69283573294);
random_device gen;
int zap (int a, int b, int c) {
if (!wyniki[{a, b, c}].st) {
wyniki[{a, b, c}] = {true, Query(a, b, c)};
wyniki[{a, c, b}] = wyniki[{a, b, c}];
wyniki[{b, a, c}] = wyniki[{a, b, c}];
wyniki[{b, c, a}] = wyniki[{a, b, c}];
wyniki[{c, a, b}] = wyniki[{a, b, c}];
wyniki[{c, b, a}] = wyniki[{a, b, c}];
}
return wyniki[{a, b, c}].nd;
}
void wyn (int a, int b) {
Bridge(min(a, b), max(a, b));
}
void dziel2(int a, int b, vector<int> v, int n) {
shuffle(v.begin(), v.end(), gen);
if (debug) {
cout << "=====DZIEL2======" << "\n";
cout << "wierzcholki: ";
for (auto x : v) {
cout << x << " ";
}
cout << "\n";
}
int m = int(v.size());
if (m == 2) {
wyn(a, b);
return;
}
vector<int> v1, v2;
set<int> s1, s2;
v1.clear();
v2.clear();
s1.clear();
s2.clear();
int ind = 0;
while (v[ind] == a || v[ind] == b) {
ind ++;
}
int w = v[ind];
s1.insert(a);
s2.insert(b);
s1.insert(w);
s2.insert(w);
for (int i = 0; i < m; i ++) {
if (a == v[i] || v[i] == w) {
continue;
}
int x = zap(a, v[i], w);
if (x == w) {
s2.insert(v[i]);
} else {
s1.insert(v[i]);
}
}
for (auto x : s1) {
v1.pb(x);
}
for (auto x : s2) {
v2.pb(x);
}
if (debug) {
cout << "a i b: " << a << " " << b << "\n";
cout << "srodkowy: " << w << "\n";
cout << "v1: ";
for (auto x : v1) {
cout << x << " ";
}
cout << "\n";
cout << "v2: ";
for (auto x : v2) {
cout << x << " ";
}
cout << "\n";
}
if (int(v1.size()) > 1) {
dziel2(a, w, v1, n);
} else {
if (int(v1.size()) == 0) {
wyn(a, w);
} else {
wyn(a, v1.back());
wyn(v1.back(), w);
}
}
if (int(v2.size()) > 1) {
dziel2(w, b, v2, n);
} else {
if (int(v2.size()) == 0) {
wyn(w, b);
} else {
wyn(b, v2.back());
wyn(v2.back(), w);
}
}
}
void dziel (vector<int> v, int n) {
shuffle(v.begin(), v.end(), gen);
if (debug) {
cout << "=====DZIEL======" << "\n";
cout << "wierzcholki: ";
for (auto x : v) {
cout << x << " ";
}
cout << "\n";
}
int m = int(v.size());
if (m < 2) {
return;
}
int u1 = v[0], u2 = v[1];
if (debug) {
cout << "boki sciezki: " << u1 << " " << u2 << "\n";
}
set<int> sciezka;
map<int, vector<int>> jakie;
sciezka.clear();
jakie.clear();
sciezka.insert(u1);
sciezka.insert(u2);
for (auto x : v) {
jakie[x].clear();
}
for (int i = 2; i < m; i ++) {
int x = zap(u1, u2, v[i]);
sciezka.insert(x);
jakie[x].pb(v[i]);
}
sciezka.insert(u1);
sciezka.insert(u2);
jakie[u1].pb(u1);
jakie[u2].pb(u2);
if (debug) {
cout << "sciezka: ";
for (auto x : sciezka) {
cout << x << " ";
}
cout << "\n";
cout << "poddzrewa: " << "\n";
for (int i = 0; i < n; i ++) {
cout << i << ": ";
for (auto x : jakie[i]) {
cout << x << " ";
}
cout << "\n";
}
}
vector<int> vsciezka;
vsciezka.clear();
for (auto x : sciezka) {
vsciezka.pb(x);
}
dziel2(u1, u2, vsciezka, n);
for (auto x : jakie) {
dziel(x.nd, n);
}
}
void Solve (int n) {
vector<int> v;
v.clear();
for (int i = 0; i < n; i ++) {
v.pb(i);
}
dziel(v, n);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |