Submission #1086396

#TimeUsernameProblemLanguageResultExecution timeMemory
1086396juicyICC (CEOI16_icc)C++17
90 / 100
89 ms888 KiB
#include "icc.h" #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 105; int pr[N]; vector<int> ver[N]; int qry(vector<int> a, vector<int> b) { return query(a.size(), b.size(), &a[0], &b[0]); } int find(int u) { return pr[u] == u ? u : pr[u] = find(pr[u]); } int find(vector<int> a, vector<int> b) { if (a.size() == 1) { return a[0]; } int l = 0, r = a.size() - 1, res = -1; while (l <= r) { int m = (l + r) / 2; if (qry(vector(a.begin(), a.begin() + m + 1), b)) { res = a[m]; r = m - 1; } else { l = m + 1; } } return res; } void run(int n) { iota(pr, pr + n, 0); for (int i = 0; i < n; ++i) { ver[i].push_back(i + 1); } for (int e = 0; e < n - 1; ++e) { vector<int> root; for (int i = 0; i < n; ++i) { if (pr[i] == i) { root.push_back(i); } } int m = root.size(); vector<int> a, b; for (int i = 0; (1 << i) < m; ++i) { vector<int>().swap(a); vector<int>().swap(b); for (int j = 0; j < m; ++j) { auto &v = j >> i & 1 ? a : b; v.insert(v.end(), ver[root[j]].begin(), ver[root[j]].end()); } if (qry(a, b)) { break; } } int u = find(a, b), v = find(b, a); setRoad(u, v); --u, --v; for (int x : ver[pr[v]]) { pr[x - 1] = pr[u]; ver[pr[u]].push_back(x); } } }
#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...