제출 #1068607

#제출 시각아이디문제언어결과실행 시간메모리
1068607duckindogInside information (BOI21_servers)C++17
15 / 100
1066 ms46708 KiB
#include <bits/stdc++.h> using namespace std; const int N = 120'000 + 10; int n, k; vector<pair<int, int>> ad[N]; vector<tuple<int, int, int>> Q; int st[N], ed[N], it; int f[N][18], increase[N][18], decrease[N][18]; void dfs(int u, int p = -1) { st[u] = ++it; for (int i = 1; i <= 17; ++i) { f[u][i] = f[f[u][i - 1]][i - 1]; if (increase[u][i - 1] != -1 && increase[f[u][i - 1]][i - 1] != -1) { if (increase[u][i - 1] < increase[f[u][i - 1]][0]) increase[u][i] = increase[f[u][i - 1]][i - 1]; } if (decrease[u][i - 1] != -1 && decrease[f[u][i - 1]][i - 1] != -1) { if (decrease[u][i - 1] > decrease[f[u][i - 1]][0]) decrease[u][i] = decrease[f[u][i - 1]][i - 1]; } } for (const auto& [v, w] : ad[u]) { if (v == p) continue; f[v][0] = u; increase[v][0] = decrease[v][0] = w; dfs(v, u); } ed[u] = it; } inline bool anc(int u, int v) { return st[u] <= st[v] && ed[u] >= ed[v]; } int get(int u, int v) { int uwd = 0, dwd = 1'000'000, ma = 0; for (int i = 17; i >= 0; --i) { if (anc(f[u][i], v)) continue; if (uwd > increase[u][i] || increase[u][i] == -1) return -1; uwd = increase[u][i]; u = f[u][i]; } if (!anc(u, v) && anc(f[u][0], v)) { if (uwd > increase[u][0] || increase[u][0] == -1) return -1; uwd = increase[u][0]; u = f[u][0]; } ma = uwd; for (int i = 17; i >= 0; --i) { if (anc(f[v][i], u)) continue; if (dwd < decrease[v][i] || decrease[v][i] == -1) return -1; dwd = decrease[v][i]; ma = max(ma, decrease[v][0]); v = f[v][i]; } if (v != u) { if (dwd < decrease[v][0] || decrease[v][0] == -1) return -1; dwd = decrease[v][0]; ma = max(ma, decrease[v][0]); v = f[v][0]; } return uwd < dwd ? ma : -1; } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> k; for (int i = 1; i < n + k; ++i) { char type; cin >> type; if (type == 'S') { int a, b; cin >> a >> b; ad[a].push_back({b, i}); ad[b].push_back({a, i}); cerr << a << " " << b << " " << i << "\n"; } if (type == 'Q') { int a, d; cin >> a >> d; Q.emplace_back(a, d, i); } if (type == 'C') { int d; cin >> d; Q.emplace_back(0, d, i); } } memset(increase, -1, sizeof increase); memset(decrease, -1, sizeof decrease); for (int i = 1; i <= n; ++i) if (!f[i][0]) dfs(f[i][0] = i); for (const auto& [a, d, i] : Q) { if (!a) continue; int time = get(d, a); cout << (time == -1 || time > i ? "no" : "yes") << '\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...