Submission #1256429

#TimeUsernameProblemLanguageResultExecution timeMemory
1256429dbencePictionary (COCI18_pictionary)C++20
140 / 140
99 ms28228 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define len(x) (x).size() #define lsb(x) (x) & (-x) #define l(x) (x << 1) + 1 #define r(x) (x << 1) + 2 #define mp make_pair #define xx first #define yy second #define pb push_back #define lb lower_bound #define ub upper_bound using namespace std; typedef long long ll; typedef pair<int, int> pii; template <typename T> void print(T t) { cout << t << "\n"; } template <typename T, typename... Args> void print(T t, Args ...args) { cout << t << " "; print(args...); } const int N = 2e5 + 1; const int L = 20; int n, m, q; struct Graph { int ind[N]; int dep[N]; int par[N]; int anc[N][L]; vector <int> adj[N]; } g; struct Dsu { int par[N]; int cnt[N]; int ind[N]; int root(int u) { return u == par[u]? u: par[u] = root(par[u]); } void unite(int u, int v) { u = root(u); v = root(v); if (u == v) { return; } if (cnt[u] < cnt[v]) { swap(u, v); } cnt[u] += cnt[v]; par[v] = u; } } dsu; void dfs(int u, int d = 0) { static int t = 0; g.dep[u] = d; g.anc[u][0] = g.par[u]; for (int i = 1; i < L; ++i) { g.anc[u][i] = g.anc[g.anc[u][i - 1]][i - 1]; } for (int v: g.adj[u]) { g.par[v] = u; dfs(v, d + 1); } } int lca(int u, int v) { if (g.dep[u] < g.dep[v]) { swap(u, v); } int k = g.dep[u] - g.dep[v]; for (int i = 0; i < L; ++i) { if (k >> i & 1) { u = g.anc[u][i]; } } if (u == v) { return u; } for (int i = L - 1; i >= 0; --i) { if (g.anc[u][i] != g.anc[v][i]) { u = g.anc[u][i]; v = g.anc[v][i]; } } return g.par[u]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> q; for (int i = 1; i <= n; ++i) { dsu.cnt[i] = 1; dsu.par[i] = i; dsu.ind[i] = i; } int on = n; for (int i = m; i >= 1; --i) { for (int j = i; j <= on; j += i) { if (dsu.root(i) != dsu.root(j)) { ++n; int u = dsu.ind[dsu.root(i)]; int v = dsu.ind[dsu.root(j)]; g.adj[n].pb(u); g.adj[n].pb(v); g.ind[n] = i; dsu.unite(i, j); dsu.ind[dsu.root(i)] = n; } } } dfs(n); for (int i = 0; i < q; ++i) { int u, v; cin >> u >> v; cout << m - g.ind[lca(u, v)] + 1 << "\n"; } }
#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...