Submission #1032165

#TimeUsernameProblemLanguageResultExecution timeMemory
1032165borisAngelovPictionary (COCI18_pictionary)C++17
0 / 140
93 ms5708 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; int n, m, k; pair<int, int> queries[maxn]; int answers[maxn]; struct DSU { int par[maxn]; int dep[maxn]; void init(int n) { for (int i = 1; i <= n; ++i) { dep[i] = 1; par[i] = i; } } int root(int node) { if (node == par[node]) return node; return par[node] = root(par[node]); } void connect(int x, int y) { x = root(x); y = root(y); if (x == y) return; if (dep[x] < dep[y]) swap(x, y); par[y] = x; if (dep[x] == dep[y]) ++dep[x]; } bool areConnected(int x, int y) { return root(x) == root(y); } }; DSU dsu; struct ParallelNode { int node; int l; int r; int ql; int qr; int level; }; int currentQueryOrder[maxn]; int nextQueryOrder[maxn]; void fastIO() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int main() { fastIO(); cin >> n >> m >> k; for (int i = 1; i <= k; ++i) { cin >> queries[i].first >> queries[i].second; } for (int i = 1; i <= k; ++i) { currentQueryOrder[i] = i; answers[i] = m; } int prvLevel = -1; int ptrLevel = 0; queue<ParallelNode> q; q.push({1, 1, m, 1, m, 1}); while (!q.empty()) { ParallelNode curr = q.front(); q.pop(); if (prvLevel != curr.level) { prvLevel = curr.level; dsu.init(n); ptrLevel = 0; } int mid = (curr.l + curr.r) / 2; for (int i = ptrLevel + 1; i <= mid; ++i) { int gcd = m - i + 1; for (int nodeNum = gcd; nodeNum + gcd <= n; nodeNum += gcd) { dsu.connect(nodeNum, nodeNum + gcd); } } ptrLevel = mid; int node = curr.node; int ql = curr.ql; int qr = curr.qr; int qlPtr = ql; int qrPtr = qr; if (curr.l == curr.r) { for (int i = ql; i <= qr; ++i) { int idx = currentQueryOrder[i]; if (dsu.areConnected(queries[idx].first, queries[idx].second) == true) { answers[idx] = min(answers[idx], mid); } } continue; } for (int i = ql; i <= qr; ++i) { int idx = currentQueryOrder[i]; if (dsu.areConnected(queries[idx].first, queries[idx].second) == true) { answers[idx] = min(answers[idx], mid); nextQueryOrder[qlPtr++] = idx; } else { nextQueryOrder[qrPtr--] = idx; } } for (int i = ql; i <= qr; ++i) { currentQueryOrder[i] = nextQueryOrder[i]; } if (ql <= qlPtr - 1) { q.push({2 * node, curr.l, mid, ql, qlPtr - 1, curr.level + 1}); } if (qr >= qrPtr + 1) { q.push({2 * node, mid + 1, curr.r, qrPtr + 1, qr, curr.level + 1}); } } for (int i = 1; i <= k; ++i) { cout << answers[i] << "\n"; } return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...