Submission #36790

#TimeUsernameProblemLanguageResultExecution timeMemory
36790aomeICC (CEOI16_icc)C++14
100 / 100
193 ms2216 KiB
#include <bits/stdc++.h> #include "icc.h" using namespace std; const int N = 105; int par[N]; vector<int> vec[N]; int find(int u) { return (u == par[u]) ? u : par[u] = find(par[u]); } void join(int u, int v) { u = find(u), v = find(v); if (vec[u].size() > vec[v].size()) swap(u, v); for (auto i : vec[u]) vec[v].push_back(i); par[u] = v, vec[u].clear(); } bool query(vector<int> a, vector<int> b) { int sza = a.size(), szb = b.size(); int A[N], B[N]; for (int i = 0; i < sza; ++i) A[i] = a[i]; for (int i = 0; i < szb; ++i) B[i] = b[i]; return query(sza, szb, A, B); } void find(int l, int r, vector<int> &go, vector<int> &to) { if (l == r) { int tmp = go[l]; go.clear(); go.push_back(tmp); return; } int mid = (l + r) >> 1; vector<int> a, b; b = to; for (int i = l; i <= mid; ++i) a.push_back(go[i]); if (query(a, b)) find(l, mid, go, to); else find(mid + 1, r, go, to); } void cal(vector<int> vx, vector<int> vy) { find(0, vx.size() - 1, vx, vy); find(0, vy.size() - 1, vy, vx); setRoad(vx[0], vy[0]), join(vx[0], vy[0]); } void run(int n) { for (int i = 1; i <= n; ++i) par[i] = i, vec[i].push_back(i); while (1) { vector<int> go; for (int i = 1; i <= n; ++i) { if (find(i) == i) go.push_back(i); } int sz = go.size(); for (int i = 0; (1 << i) < sz; ++i) { vector<int> a, b; for (int j = 0; j < sz; ++j) { if (j >> i & 1) { for (auto k : vec[go[j]]) a.push_back(k); } else { for (auto k : vec[go[j]]) b.push_back(k); } } if (query(a, b)) { cal(a, b); break; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...