#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
const int MAX = 110;
int n;
int parent[MAX];
int depth[MAX];
vector <int> v[MAX];
vector <int> groups;
int find(int a) {
if (a == parent[a]) return a;
return parent[a] = find(parent[a]);
}
void spoji(int a, int b) {
setRoad(a, b);
a = find(a);
b = find(b);
if (a == b) return;
if (depth[a] >= depth[b]) {
depth[a] += depth[b];
parent[b] = a;
for (auto e : v[b]) v[a].push_back(e);
}
else {
depth[b] += depth[a];
parent[a] = b;
for (auto e : v[a]) v[b].push_back(e);
}
}
int sendQuery(vector <int> a, vector <int> b) {
if (a.empty()) return 0;
if (b.empty()) return 0;
int sza = a.size();
int szb = b.size();
int arra[sza];
int arrb[szb];
for (int i = 0; i < sza; i++) arra[i] = a[i];
for (int i = 0; i < szb; i++) arrb[i] = b[i];
return query(sza, szb, arra, arrb);
}
void rek(vector <int> g, vector <int> g2, int o);
void nadiUnutarGrupe(int g, int g2) {
vector <int> a, b;
for (int i = 1; i <= n; i++) {
if (find(i) == g) a.push_back(i);
if (find(i) == g2) b.push_back(i);
}
rek(a, b, 2);
}
void rek(vector <int> g, vector <int> g2, int o) {
if (g.size() == 1 && g2.size() == 1) {
if (o == 1) nadiUnutarGrupe(g[0], g2[0]);
else spoji(g[0], g2[0]);
return;
}
vector <int> gpola, gpola2, g2pola, g2pola2;
for (int i = 0; i < (int)g.size(); i++) {
if (i < g.size() / 2) gpola.push_back(g[i]);
else gpola2.push_back(g[i]);
}
for (int i = 0; i < (int)g2.size(); i++) {
if (i < g2.size() / 2) g2pola.push_back(g2[i]);
else g2pola2.push_back(g2[i]);
}
if (sendQuery(gpola, g2)) {
if (sendQuery(gpola, g2pola)) rek(gpola, g2pola, o);
else rek(gpola, g2pola2, o);
}
else {
if (sendQuery(gpola2, g2pola)) rek(gpola2, g2pola, o);
else rek(g2pola, g2pola2, o);
}
}
void solve() {
vector <int> g, g2;
int bit = 0;
while (true) {
g.clear(), g2.clear();
for (int i = 0; i < (int)groups.size(); i++) {
if (i & (1 << bit)) g.push_back(groups[i]);
else g2.push_back(groups[i]);
}
if (sendQuery(g, g2)) break;
bit++;
}
rek(g, g2, 1);
}
void run(int N) {
n = N;
for (int i = 1; i <= n; i++) {
parent[i] = i;
depth[i] = 1;
v[i].push_back(i);
}
for (int i = 1; i < n; i++) {
groups.clear();
for (int j = 1; j <= n; j++) if (find(j) == j) groups.push_back(j);
solve();
}
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |