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 "icc.h"
using namespace std;
const int maxn = 105;
int find_vr(int na, int nb, int a[], int b[])
{
int lo = 1, hi = na;
while (lo < hi)
{
int mi = (lo + hi) >> 1;
int *c = new int[maxn];
for (int i = 0; i < mi; i++) c[i] = a[i];
if (query(mi, nb, c, b)) hi = mi;
else lo = mi+1;
}
return a[lo-1]-1;
}
vector<int> c[maxn], g[maxn];
int vis[maxn], a[maxn], b[maxn];
void dfs(int u, int col)
{
vis[u] = 1, c[col].push_back(u);
for (int v : g[u]) if (!vis[v]) dfs(v, col);
}
void run(int n)
{
for (int e = 0; e < n-1; e++)
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) c[i].clear();
int cnt = 0;
for (int i = 0; i < n; i++) if (!vis[i]) dfs(i, cnt++);
for (int i = 0; (1 << i) < cnt; i++)
{
int na = 0, nb = 0;
for (int j = 0; j < cnt; j++)
{
if ((1 << i) & j) for (int vr : c[j]) a[na++] = vr+1;
else for (int vr : c[j]) b[nb++] = vr+1;
}
if (query(na, nb, a, b))
{
int u = find_vr(na, nb, a, b);
int v = find_vr(nb, na, b, a);
g[u].push_back(v), g[v].push_back(u);
setRoad(u+1, v+1);
break;
}
}
}
}
# | 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... |