제출 #1311141

#제출 시각아이디문제언어결과실행 시간메모리
1311141ja_tausfPictionary (COCI18_pictionary)C++20
140 / 140
127 ms29440 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define vll vector<ll> #define vpl vector<pair<long long, long long>> #define _fastio ios_base:: sync_with_stdio(false); cin.tie(0); cout.tie(0); #define lmax LONG_LONG_MAX #define lmin LONG_LONG_MIN #define mxn 200007 #define endl <<'\n' // #pragma GCC target("sse4") // #pragma GCC target ("sse4.2") // #pragma GCC optimize("Ofast") // #pragma GCC target("avx,avx2,fma") // #pragma GCC optimize("03") // #pragma GCC optimize("unroll loops") ll t, n, m, k, w; string s, s1; const int mod = 1e9 + 7; vector<vll> reTree; vector <int> ans; struct RT { int n; // size of the reTree, (V + E) vector <int> par; RT (int n) : n(n) { par = ans = vector <int>(n + 1); reTree = vector <vll>(n + 1); iota(par.begin(), par.end(), 0); } inline int find(int x) { if (par[x] == x) return x; return par[x] = find(par[x]); } void build() { //{w, u, v} 1 based // sort(e.begin(), e.end()); int id = n / 2; for (int i = m; i >= 1; i--) { for (ll z = i; z <= n / 2; z += i) { int u = i, v = z; u = find(u), v = find(v); if (u == v) { continue; } par[u] = par[v] = ++id; ans[id] = m - i + 1; w = id; reTree[id].push_back(u); reTree[id].push_back(v); } } } }; const int LG = 20, N = 2e5 + 7; int par[N][21], dep[N], sz[N]; void dfs (int u, int p = 0) { par[u][0] = p; dep[u] = 1 + dep[p]; sz[u] = 1; for (int i = 1; i <= LG; i++) { par[u][i] = par[par[u][i - 1]][i - 1]; } for (auto &&v : reTree[u]) { if (v == p) { continue; } dfs(v, u); sz[u] += sz[v]; } } int lca (int u, int v) { if (dep[u] < dep[v]) { swap(u, v); } for (int k = LG - 1; k >= 0; k--) { if (dep[par[u][k]] >= dep[v]) { u = par[u][k]; } } if (u == v) { return u; } for (int k = LG - 1; k >= 0; k--) { if (par[u][k] != par[v][k]) { u = par[u][k]; v = par[v][k]; } } return par[u][0]; } signed main() { _fastio; ll tc = 0; // cin >> t; // while (t--) // { cin >> n >> m >> k; RT rt(2 * n); rt.build(); dfs(w); while (k--) { ll u, v; cin >> u >> v; ll lc = lca(u, v); cout << ans[lc] << '\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...