Submission #726216

#TimeUsernameProblemLanguageResultExecution timeMemory
726216bitaro1337Prize (CEOI22_prize)C++14
0 / 100
2284 ms474048 KiB
//BITARO BITARO BITARO #include <bits/stdc++.h> using namespace std; using ll = long long; const int K = 20; struct tree { int n, root, tt = 0; vector<ll> dist; vector<vector<pair<int, ll>>> adj; vector<vector<int>> jump, g; vector<bool> vis; vector<int> time_in, depth; tree(int _n, int _root) { n = _n, root = _root; adj.resize(n); g.resize(n); } void init() { dist.assign(n, 0); depth.assign(n, 0); vis.assign(n, false); jump.assign(n, vector<int>(K, root)); time_in.assign(n, 0); dfs(root, -1); for(int j = 1; j < K; ++j) { for(int i = 0; i < n; ++i) { jump[i][j] = jump[jump[i][j - 1]][j - 1]; } } } void add_edge(int a, int b) { if(a >= n || b >= n) exit(0); g[a].push_back(b); } void add_edge(int a, int b, ll w) { if(a >= n || b >= n) exit(0); adj[a].push_back({b, w}); } void dfs(int u, int par) { time_in[u] = tt++; for(int v: g[u]) { if(v == par) continue; depth[v] = depth[u] + 1; dfs(v, u); } } void get_distances(int u) { vis[u] = true; for(auto x: adj[u]) { int v = x.first; ll w = x.second; if(vis[v]) continue; dist[v] = dist[u] + w; get_distances(v); } } int tm(int v) {return time_in[v];} int lca(int a, int b) { if(depth[a] < depth[b]) swap(a, b); for(int j = K - 1; j >= 0; --j) { if(depth[jump[a][j]] >= depth[b]) a = jump[a][j]; } if(a == b) return a; for(int j = K - 1; j >= 0; --j) { if(jump[a][j] != jump[b][j]) a = jump[a][j], b = jump[b][j]; } return jump[a][0]; } int get_depth(int u) {return dist[u];} }; int main() { int n, k, q, t; cin >> n >> k >> q >> t; vector<int> p1(n), p2(n); int root1 = -1, root2 = -1; for(int i = 0; i < n; ++i) { cin >> p1[i]; --p1[i]; if(p1[i] == -2) root1 = i; } for(int i = 0; i < n; ++i) { cin >> p2[i]; --p2[i]; if(p2[i] == -2) root2 = i; } if(root1 == -1 || root2 == -1) exit(0); tree t1(n, root1), t2(n, root2); for(int i = 0; i < n; ++i) { if(p1[i] != -2) t1.add_edge(p1[i], i); if(p2[i] != -2) t2.add_edge(p2[i], i); } t1.init(); t2.init(); vector<int> nodes(n); iota(nodes.begin(), nodes.end(), 0); vector<int> time1(n), time2(n); for(int i = 0; i < n; ++i) { time1[i] = t1.tm(i); time2[i] = t2.tm(i); } //sort(nodes.begin(), nodes.end(), [&](int x, int y){return time1[x] < time1[y];}); while((int)nodes.size() > k) nodes.pop_back(); if(nodes[0] != root1) exit(0); if(t1.tm(root2) >= k) { nodes.pop_back(); nodes.push_back(root2); } if(nodes.size() != k) exit(0); for(int x: nodes) cout << x + 1 << " "; cout << "\n"; cout.flush(); //sort(nodes.begin(), nodes.end(), [&](int x, int y){return time2[x] < time2[y];}); for(int i = 0; i < k - 1; ++i) { cout << "? " << nodes[i] + 1 << " " << nodes[i + 1] + 1 << "\n"; } cout << "!\n"; cout.flush(); for(int i = 0; i < k - 1; ++i) { { int u = nodes[i], v = nodes[i + 1]; int l = t1.lca(u, v); int c1, c2; cin >> c1 >> c2; t1.add_edge(l, u, c1); t1.add_edge(l, v, c2); t1.add_edge(u, l, -c1); t1.add_edge(v, l, -c2); } { int u = nodes[i], v = nodes[i + 1]; int l = t2.lca(u, v); int c1, c2; cin >> c1 >> c2; t2.add_edge(l, u, c1); t2.add_edge(l, v, c2); t2.add_edge(u, l, -c1); t2.add_edge(v, l, -c2); } } t1.get_distances(root1); t2.get_distances(root2); vector<pair<int, int>> queries(t); for(int i = 0; i < t; ++i) { cin >> queries[i].first >> queries[i].second; --queries[i].first, --queries[i].second; } for(auto x: queries) { { int l = t1.lca(x.first, x.second); cout << t1.get_depth(x.first) + t1.get_depth(x.second) - 2 * t1.get_depth(l) << " "; } { int l = t2.lca(x.first, x.second); cout << t2.get_depth(x.first) + t2.get_depth(x.second) - 2 * t2.get_depth(l) << "\n"; } } cout.flush(); }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:107:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |     if(nodes.size() != k) exit(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...