제출 #1086410

#제출 시각아이디문제언어결과실행 시간메모리
1086410juicyICC (CEOI16_icc)C++17
90 / 100
123 ms676 KiB
#include "icc.h" #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); 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 m = a.size() / 2; auto lt = vector(a.begin(), a.begin() + m), rt = vector(a.begin() + m, a.end()); return qry(lt, b) ? find(lt, b) : find(rt, b); } 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); } } shuffle(root.begin(), root.end(), rng); 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...