Submission #551491

#TimeUsernameProblemLanguageResultExecution timeMemory
551491sidonInside information (BOI21_servers)C++17
50 / 100
285 ms33248 KiB
#include <bits/stdc++.h> using namespace std; const int Z = 1.2e5, B = 17; int N, K, p[Z][B], up[Z][2], d[Z], pE[Z], res[Z]; vector<array<int, 2>> g[Z], h[Z]; vector<array<int, 4>> pQ; void init(const int &u) { for(int i = 0; i + 1 < B; ++i) p[u][i+1] = p[p[u][i]][i]; for(const auto &[v, i] : g[u]) if(v != p[u][0]) { p[v][0] = u; d[v] = d[u] + 1; pE[v] = i; if(pE[u] < i) { up[v][0] = up[u][0]; up[v][1] = u; } else { up[v][0] = u; up[v][1] = up[u][1]; } init(v); } } int _u, _v; int lca(int u, int v) { bool swapped = 0; if((swapped = (d[u] < d[v]))) swap(u, v); if(d[u] > d[v]) { for(int i = B; i--; ) if((d[u] - d[v] - 1) & (1<<i)) u = p[u][i]; if(p[u][0] == v) { _u = u; return v; } u = p[u][0]; } for(int i = B; i--; ) if(p[u][i] != p[v][i]) u = p[u][i], v = p[v][i]; if(swapped) swap(u, v); _u = u, _v = v; return p[u][0]; } int main() { cin >> N >> K; for(int i {}, j {}; i < N - 1 + K; ++i) { char t; int u, v; cin >> t >> u; --u; if(t == 'S') { cin >> v; --v; g[u].push_back({v, i}); g[v].push_back({u, i}); } if(t == 'Q') { cin >> v; --v; pQ.push_back({j++, i, u, v}); } if(t == 'C') h[u].push_back({j++, i}); } init(0); for(const auto &[j, i, u, v] : pQ) { int w = lca(u, v), val = w == u ? pE[_u] : pE[u]; if(w != u && w != v && pE[_u] < pE[_v]) val = i; if(u == v || (max(d[up[u][0]], d[up[v][1]]) <= d[w] && val < i)) res[j] = -1; else res[j] = -2; } for(int j = 0; j < K; ++j) { if(res[j] < 0) cout << (res[j] & 1 ? "yes" : "no"); else assert(0); cout << '\n'; } }
#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...
#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...