#include "sphinx.h"
#include <bits/stdc++.h>
using namespace std;
using vi =vector<int>;
using vvi =vector<vi>;
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define all(x) (x).begin(), (x).end()
#define bg(x) (x).begin()
#define en(x) (x).end()
#define sz(x) int((x).size())
#define rev(x) reverse(all(x))
#define srt(x) sort(all(x))
#define each(a, x) for (auto &a : x)
#define trace(x) for (auto &el : x) cout << el << " "
struct DSU {
int n; vi par, siz;
DSU() {};
DSU(int N) {
n = N; siz.assign(n, 1);
par.resize(n); iota(all(par), 0);
}
int find(int v) {
if (par[v] == v) return v;
return par[v] = find(par[v]);
}
void unite(int a, int b) {
a = find(a); b = find(b);
if (a != b) {
if (siz[b] > siz[a]) swap(a, b);
par[b] = a; siz[a] += siz[b];
}
}
};
int n, m;
vi x, y;
vvi adj;
vi find_colours(int N, vi X, vi Y) {
n = N; m = sz(X); x = X; y = Y;
adj.assign(n, vi());
FOR(i, 0, m) adj[x[i]].pb(y[i]), adj[y[i]].pb(x[i]);
vi bfs_order;
vector<bool> seen(n, false);
queue<int> q; q.push(0);
seen[0] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
bfs_order.push_back(cur);
for (auto &v : adj[cur]) {
if (seen[v]) continue;
q.push(v);
seen[v] = true;
}
}
vi graph(n, n);
if (n == 2) {
graph[0] = perform_experiment({-1, 0}) == 1 ? 0 : 1;
graph[1] = perform_experiment({0, -1}) == 1 ? 0 : 1;
return graph;
}
auto dsu = DSU(n);
vector<set<int>> members; members.push_back(set<int>({0}));
vector<int> reps; reps.push_back(0);
FOR(index, 1, n) {
int i = bfs_order[index];
int lo = 0, hi = sz(reps);
// trace(reps); cout << "\n";
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
vi test(n, n);
FOR(idx, 0, mid+1) each(member, members[idx]) test[member] = -1;
test[i] = -1;
int expected = (*max_element(all(test)) == -1 ? 0 : 1) + (mid) + 1;
// cout << "mid: " << mid << " perf: " << perform_experiment(test) << " expected: " << expected << "\n";
if (perform_experiment(test) == expected) {
hi = mid;
} else {
lo = mid+1;
}
}
// cout << "lo: " << lo << "\n";
if (lo >= sz(reps)) {
reps.push_back(i);
members.push_back(set<int>({i}));
} else {
dsu.unite(reps[lo], i);
members[lo].insert(i);
}
}
FOR(i, 0, n) {
graph[i] = dsu.find(i);
}
return graph;
}
# | 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... |