Submission #1195619

#TimeUsernameProblemLanguageResultExecution timeMemory
1195619anmattroiInside information (BOI21_servers)C++17
48 / 100
132 ms35400 KiB
#include <bits/stdc++.h> #define maxn 120005 #define fi first #define se second using namespace std; using ii = pair<int, int>; const int INF = 1'000'000'000; int n, k; vector<ii> adj[maxn]; struct query { char type; int u, v; query() {} } queries[maxn+maxn]; int pe[maxn], d[maxn], f[17][maxn], g[17][maxn]; int ASC[maxn], DESC[maxn]; int jump(int x, int k) { for (int i = 0; i < 17; i++) if (k>>i&1) x = f[i][x]; return x; } int LCA(int u, int v) { if (d[u] > d[v]) swap(u, v); if (d[u] < d[v]) v = jump(v, d[v]-d[u]); if (u == v) return u; for (int i = 16; i >= 0; i--) if (f[i][u] != f[i][v]) { u = f[i][u]; v = f[i][v]; } return f[0][u]; } void pfs(int u, int dad) { f[0][u] = dad; g[0][u] = pe[u]; for (int i = 1; i < 17; i++) { f[i][u] = f[i-1][f[i-1][u]]; g[i][u] = max(g[i-1][u], g[i-1][f[i-1][u]]); } ASC[u] = (pe[u] < pe[dad] ? ASC[dad] : dad); DESC[u] = (pe[u] > pe[dad] ? DESC[dad] : dad); for (auto [v, l] : adj[u]) if (v != dad) { pe[v] = l; d[v] = d[u]+1; pfs(v, u); } } int ASCENSION(int u, int w) { return d[ASC[u]] <= d[w]; } int DECENSION(int u, int w) { return d[DESC[u]] <= d[w]; } int MAXIMUS(int u, int v, int w, int TIME) { int k, ans = 0; k = d[u]-d[w]; for (int i = 0; i < 17; i++) if (k>>i&1) { ans = max(ans, g[i][u]); u = f[i][u]; } k = d[v]-d[w]; for (int i = 0; i < 17; i++) if (k>>i&1) { ans = max(ans, g[i][v]); v = f[i][v]; } return ans < TIME; } void queryQ(int u, int v, int TIME) { swap(u, v); int w = LCA(u, v); int condition = 1; condition &= ASCENSION(u, w); condition &= DECENSION(v, w); if (w != u && w != v) condition &= (pe[jump(u, d[u]-d[w]-1)] < pe[jump(v, d[v]-d[w]-1)]); condition &= MAXIMUS(u, v, w, TIME); cout << (condition ? "yes\n" : "no\n"); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> k; for (int i = 1; i < n+k; i++) { cin >> queries[i].type >> queries[i].u; if (queries[i].type != 'C') cin >> queries[i].v; if (queries[i].type == 'S') { adj[queries[i].u].emplace_back(queries[i].v, i); adj[queries[i].v].emplace_back(queries[i].u, i); } } pfs(1, 0); for (int i = 1; i < n+k; i++) if (queries[i].type == 'Q') queryQ(queries[i].u, queries[i].v, i); }
#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...