제출 #725953

#제출 시각아이디문제언어결과실행 시간메모리
725953tengiz05Prize (CEOI22_prize)C++17
0 / 100
2444 ms730612 KiB
#include <bits/stdc++.h> using i64 = long long; constexpr int N = 1E6 + 5; struct Tree { std::vector<int> adj[N]; int up[N][20]; int in[N], out[N]; int timeStamp = 0; void dfs(int u, int p) { in[u] = timeStamp++; up[u][0] = p; for (int i = 1; i < 20; i++) { up[u][i] = up[up[u][i - 1]][i - 1]; } for (int v : adj[u]) { dfs(v, u); } out[u] = timeStamp; } bool is(int u, int v) { return in[u] <= in[v] && in[v] < out[u]; } int lca(int u, int v) { if (is(u, v)) return u; if (is(v, u)) return v; for (int i = 19; i >= 0; i--) { if (!is(up[u][i], v)) { u = up[u][i]; } } return up[u][0]; } std::vector<std::pair<int, int>> e[N]; int sum[N]; bool vis[N]; void fill(int u) { vis[u] = true; for (auto [v, w] : e[u]) { if (vis[v]) continue; if (in[v] > in[u]) { sum[v] = sum[u] + w; } else { sum[v] = sum[u] - w; } fill(v); } } } t1, t2; /* 9 3 2 3 2 -1 2 1 1 5 1 4 5 9 4 5 5 7 3 -1 3 7 0 6 13 0 3 0 0 5 2 7 7 1 1 2 */ int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n, k, q, T; std::cin >> n >> k >> q >> T; int r1 = -1, r2 = -1; for (int i = 0; i < n; i++) { int p; std::cin >> p; if (p == -1) r1 = i; else { p--; t1.adj[p].push_back(i); } } for (int i = 0; i < n; i++) { int p; std::cin >> p; if (p == -1) r2 = i; else { p--; t2.adj[p].push_back(i); } } t1.dfs(r1, r1); t2.dfs(r2, r2); assert(false); std::vector<int> f{r1, r2}; for (int i = 0; int(f.size()) < k; i++) { if (i != r1 && i != r2) { f.push_back(i); } } for (int i = 0; i < k; i++) { std::cout << f[i] + 1 << " "; } std::cout << std::endl; for (int i = 0; i < k - 1; i++) { std::cout << "? " << f[i] + 1 << " " << f[i + 1] + 1 << "\n"; } std::cout << "!" << std::endl; for (int i = 0; i < k - 1; i++) { int a = f[i]; int b = f[i + 1]; int l = t1.lca(a, b); int c1, c2; std::cin >> c1 >> c2; t1.e[a].emplace_back(l, c1); t1.e[l].emplace_back(a, c1); t1.e[b].emplace_back(l, c2); t1.e[l].emplace_back(b, c2); l = t2.lca(a, b); std::cin >> c1 >> c2; t2.e[a].emplace_back(l, c1); t2.e[l].emplace_back(a, c1); t2.e[b].emplace_back(l, c2); t2.e[l].emplace_back(b, c2); } t1.fill(r1); t2.fill(r2); std::vector<std::pair<int, int>> queries(T); for (auto &[a, b] : queries) { std::cin >> a >> b; a--; b--; } for (auto [a, b] : queries) { int l = t1.lca(a, b); std::cout << t1.sum[a] + t1.sum[b] - 2 * t1.sum[l] << " "; l = t2.lca(a, b); std::cout << t2.sum[a] + t2.sum[b] - 2 * t2.sum[l] << "\n"; } std::cout.flush(); 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...