Submission #1000987

#TimeUsernameProblemLanguageResultExecution timeMemory
1000987LucaLucaMTourism (JOI23_tourism)C++17
10 / 100
116 ms140612 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cassert> #include <cstring> #include <set> #warning That's the baby, that's not my baby #define debug(x) #x << " = " << x << '\n' typedef long long ll; const int NMAX = 3e5; const int LGMAX = 18; int aib[NMAX + 1]; int answer[NMAX + 1]; int a[NMAX + 1]; std::vector<int> g[NMAX + 1]; std::set<std::pair<int, int>> queries[NMAX + 1]; std::vector<std::pair<int, int>> curQ[NMAX + 1]; int depth[NMAX + 1]; int tin[NMAX + 1], tout[NMAX + 1], timer; int jump[LGMAX + 1][NMAX + 1]; int sum[NMAX + 1]; int added[NMAX + 1], added2[NMAX + 1]; int parent[NMAX + 1]; bool ancestor(int u, int v) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } int lca(int u, int v) { if (ancestor(u, v)) { return u; } for (int k = LGMAX; k >= 0; k--) { if (jump[k][u] != 0 && !ancestor(jump[k][u], v)) { u = jump[k][u]; } } return jump[0][u]; } void dfs(int u, int p = 0) { depth[u] = depth[p] + 1; tin[u] = ++timer; jump[0][u] = p; for (const auto &v : g[u]) { if (v != p) { dfs(v, u); } } tout[u] = timer; } void dfs1(int u, int p = 0) { parent[u] = p; for (const auto &v : g[u]) { if (v != p) { dfs1(v, u); } } } std::vector<std::pair<int, int>> updates; void update(int pos, const int &val) { if (val != 0) { updates.push_back({pos, val}); } for (; pos < NMAX; pos += pos & -pos) { aib[pos] += val; } } int query(int pos) { int ret = 0; for (; pos > 0; pos -= pos & -pos) { ret += aib[pos]; } return ret; } bool cmp(int x, int y) { return tin[x] < tin[y]; } void divide(int l, int r) { if (l >= r) { return; } int mid = (l + r) / 2; for (int i = mid + 1; i <= r; i++) { if (queries[i].empty()) { continue; } if ((*queries[i].rbegin()).first < l) { continue; } auto it = queries[i].lower_bound({l, 0}); while (it != queries[i].end() && it -> first <= mid) { curQ[i].push_back(*it); it++; } for (const auto &[L, index] : curQ[i]) { queries[i].erase({L, index}); } } std::vector<int> vert; for (int i = l; i <= r; i++) { vert.push_back(a[i]); } std::sort(vert.begin(), vert.end()); vert.erase(std::unique(vert.begin(), vert.end()), vert.end()); std::sort(vert.begin(), vert.end(), cmp); int sz = (int) vert.size(); for (int i = 1; i < sz; i++) { vert.push_back(lca(vert[i - 1], vert[i])); } std::sort(vert.begin(), vert.end()); vert.erase(std::unique(vert.begin(), vert.end()), vert.end()); std::sort(vert.begin(), vert.end(), cmp); for (int i = 1; i < (int) vert.size(); i++) { int w = lca(vert[i - 1], vert[i]); g[w].push_back(vert[i]); g[vert[i]].push_back(w); } for (const auto &u : vert) { parent[u] = 0; } dfs1(a[mid]); for (const auto &u : vert) { added[u] = added2[u] = 0; } sum[mid] = 0; added[a[mid]] = added2[a[mid]] = mid; for (int i = mid - 1; i >= l; i--) { int u = a[i]; int add = 0; while (!added[u]) { added[u] = i; add += std::abs(depth[u] - depth[parent[u]]); u = parent[u]; } sum[i] = sum[i + 1] + add; } for (int i = mid + 1; i <= r; i++) { int u = a[i]; while (!added2[u]) { if (added[u] != mid) { update(added[u] + 1, std::abs(depth[u] - depth[parent[u]])); } added2[u] = i; u = parent[u]; } for (const auto &[L, index] : curQ[i]) { answer[index] = query(L) + sum[L]; } curQ[i].clear(); } for (const auto &[x, y] : updates) { update(x, -y); } updates.clear(); for (const auto &u : vert) { g[u].clear(); } if (l < r) { divide(l, mid); divide(mid + 1, r); } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n, m, q; std::cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; std::cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1); for (int k = 1; k <= LGMAX; k++) { for (int i = 1; i <= n; i++) { jump[k][i] = jump[k - 1][jump[k - 1][i]]; } } for (int i = 1; i <= m; i++) { std::cin >> a[i]; } for (int i = 0; i < q; i++) { int l, r; std::cin >> l >> r; if (l != r) { queries[r].insert({l, i}); } else { answer[i] = 0; } } for (int i = 1; i <= n; i++) { g[i].clear(); } divide(1, m); for (int i = 0; i < q; i++) { std::cout << answer[i] + 1 << '\n'; } return 0; }

Compilation message (stderr)

tourism.cpp:7:2: warning: #warning That's the baby, that's not my baby [-Wcpp]
    7 | #warning That's the baby, that's not my baby
      |  ^~~~~~~
#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...