Submission #1189324

#TimeUsernameProblemLanguageResultExecution timeMemory
1189324anmattroiTourism (JOI23_tourism)C++17
28 / 100
5090 ms14788 KiB
#include <bits/stdc++.h> #define fi first #define se second #define maxn 100005 using namespace std; using ii = pair<int, int>; int n, m, q, d[maxn], c[maxn], id = 0, euler[maxn]; vector<int> adj[maxn]; int f[18][maxn]; void pfs(int u, int dad) { f[0][u] = dad; euler[u] = ++id; for (int i = 1; i <= 17; i++) f[i][u] = f[i-1][f[i-1][u]]; for (int v : adj[u]) if (v != dad) { d[v] = d[u] + 1; pfs(v, u); } } int lca(int u, int v) { function<int(int, int)> jump = [&](int x, int k) { for (int i = 0; i <= 17; i++) if (k>>i&1) x = f[i][x]; return x; }; if (d[u] > d[v]) swap(u, v); if (d[u] < d[v]) v = jump(v, d[v]-d[u]); if (u == v) return u; for (int i = 17; i >= 0; i--) if (f[i][u] != f[i][v]) { u = f[i][u]; v = f[i][v]; } return f[0][u]; } int dis(int u, int v) { return d[u] + d[v] - 2 * d[lca(u, v)]; } void solve() { int l, r; cin >> l >> r; vector<int> a; for (int i = l; i <= r; i++) a.emplace_back(c[i]); sort(a.begin(), a.end(), [&](int x, int y) {return euler[x] < euler[y];}); int ans = 0; for (int i = 1; i < a.size(); i++) ans += dis(a[i], a[i-1]); ans += dis(a[0], a.back()); cout << ans / 2 + 1 << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].emplace_back(v); adj[v].emplace_back(u); } pfs(1, 0); for (int i = 1; i <= m; i++) cin >> c[i]; while (q--) solve(); }
#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...