Submission #1112561

#TimeUsernameProblemLanguageResultExecution timeMemory
1112561Ghulam_JunaidICC (CEOI16_icc)C++17
0 / 100
4 ms592 KiB
#include <bits/stdc++.h> #include "icc.h" using namespace std; #define all(v) v.begin(), v.end() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 105; int n, par[N]; vector<int> S[N]; int root(int v){ return (par[v] == -1 ? v : par[v] = root(par[v])); } void merge(int u, int v){ if ((u = root(u)) == (v = root(v))) return ; if (S[u].size() > S[v].size()) swap(u, v); for (int x : S[u]){ par[x] = v; S[v].push_back(x); } S[u].clear(); } void run(int nn){ n = nn; for (int i = 1; i <= n; i ++) par[i] = -1, S[i] = {i}; for (int edge = 0; edge < n - 1; edge ++){ vector<int> roots[2], vec[2]; while (1){ set<int> st; for (int v = 1; v <= n; v ++) st.insert(root(v)); vector<int> all_roots; for (int v : st) all_roots.push_back(v); for (int j : {0, 1}) roots[j].clear(), vec[j].clear(); for (int x : all_roots){ int id = rng() % 2; roots[id].push_back(x); for (int v : S[x]) vec[id].push_back(v); } int a[vec[0].size()], b[vec[1].size()]; copy(all(vec[0]), a), copy(all(vec[1]), b); int res = query(vec[0].size(), vec[1].size(), a, b); if (res) break; } for (int j : {0, 1}){ int l = -1; int r = roots[j].size() - 1; while (r - l > 1){ int mid = (l + r) / 2; vec[j].clear(); for (int i = 0; i <= mid; i ++) for (int v : S[roots[j][i]]) vec[j].push_back(v); int a[vec[0].size()], b[vec[1].size()]; copy(all(vec[0]), a), copy(all(vec[1]), b); int res = query(vec[0].size(), vec[1].size(), a, b); if (res) r = mid; else l = mid; vec[j].clear(); for (int i = l + 1; i <= r; i ++) for (int v : S[roots[j][i]]) vec[j].push_back(v); } roots[j] = {roots[j][r]}; } vector<int> tmp[2] = {vec[0], vec[1]}; for (int j : {0, 1}){ int l = -1; int r = vec[j].size() - 1; while (r - l > 1){ int mid = (l + r) / 2; tmp[j].clear(); for (int i = 0; i <= mid; i ++) tmp[j].push_back(vec[j][i]); int a[tmp[0].size()], b[tmp[1].size()]; copy(all(tmp[0]), a), copy(all(tmp[1]), b); int res = query(tmp[0].size(), tmp[1].size(), a, b); if (res) r = mid; else l = mid; tmp[j].clear(); for (int i = l + 1; i <= r; i ++) tmp[j].push_back(vec[j][i]); } vec[j] = tmp[j]; } setRoad(vec[0][0], vec[1][0]); } }
#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...