제출 #1000902

#제출 시각아이디문제언어결과실행 시간메모리
1000902LucaLucaMTourism (JOI23_tourism)C++17
34 / 100
399 ms77480 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cassert> #include <cstring> #include <functional> #warning That's the baby, that's not my baby #define debug(x) #x << " = " << x << '\n' typedef long long ll; const int NMAX = 2e5 + 7; const int LGMAX = 18; int aib[NMAX + 1]; int answer[NMAX + 1]; int a[NMAX + 1]; std::vector<int> g[NMAX + 1]; std::vector<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) { for (const auto &v : g[u]) { if (v != parent[u]) { parent[v] = u; dfs1(v); } } } 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; } void divide(int l, int r, const std::vector<std::tuple<int, int, int>> &queries) { if (l >= r || queries.empty()) { return; } int mid = (l + r) / 2; std::vector<std::tuple<int, int, int>> quel, quer; for (const auto &[l, r, index] : queries) { if (r <= mid) { quel.push_back({l, r, index}); } else if (mid < l) { quer.push_back({l, r, index}); } else { curQ[r].push_back({l, index}); } } std::vector<int> vert; for (int i = l; i <= r; i++) { vert.push_back(a[i]); } std::sort(vert.begin(), vert.end(), [&](int x, int y) { return tin[x] < tin[y]; }); vert.erase(std::unique(vert.begin(), vert.end()), vert.end()); 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(), [&](int x, int y) { return tin[x] < tin[y]; }); vert.erase(std::unique(vert.begin(), vert.end()), vert.end()); 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(); } divide(l, mid, quel); divide(mid + 1, r, quer); } 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]; } std::vector<std::tuple<int, int, int>> queries; for (int i = 0; i < q; i++) { int l, r; std::cin >> l >> r; if (l == r) { answer[i] = 0; } else { queries.push_back({l, r, i}); } } for (int i = 1; i <= n; i++) { g[i].clear(); } divide(1, m, queries); for (int i = 0; i < q; i++) { std::cout << answer[i] + 1 << '\n'; } return 0; }

컴파일 시 표준 에러 (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...