Submission #994205

#TimeUsernameProblemLanguageResultExecution timeMemory
994205vjudge1Jail (JOI22_jail)C++17
0 / 100
5098 ms24972 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 120'001; const int K = 20; vector<int> g[MAXN], g2[MAXN]; int tin[MAXN], tout[MAXN], s[MAXN], e[MAXN], col[MAXN], hv[MAXN], up[MAXN][K], timer; bool ok; void dfs(int u, int p = -1) { tin[u] = timer++; up[u][0] = p == -1 ? 0 : p; for (int v : g[u]) { if (v != p) dfs(v, u); } tout[u] = timer++; } void dfs2(int u, stack<int> &top) { col[u] = 1; for (int v : g2[u]) { if (col[v] == 0) dfs2(v, top); else if (col[v] == 1) ok = false; } col[u] = 2; top.push(u); } bool is_ancestor(int u, int v) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } int get_next(int u, int v) { for (int i = K-1; i >= 0; i--) { if (up[v][i] && !is_ancestor(up[v][i], u) && up[v][i] != u) v = up[v][i]; } return v; } void solve() { int n; cin >> n; ok = true; fill(s, s+n+1, 0); fill(e, e+n+1, 0); fill(col, col+n+1, 0); fill(hv, hv+n+1, 0); timer = 1; for (int i = 1; i <= n; i++) { g[i].clear(); g2[i].clear(); } for (int i = 0; i < n-1; i++) { int u, v; cin >> u >> v; g[u].emplace_back(v); g[v].emplace_back(u); } dfs(1); for (int u = 1; u <= n; u++) { for (int i = 1; i < K; i++) { up[u][i] = up[up[u][i-1]][i-1]; } } int m; cin >> m; vector<pair<int, int>> edges(m+1); for (int i = 1; i <= m; i++) { cin >> edges[i].first >> edges[i].second; auto [u, v] = edges[i]; s[u] = e[v] = i; hv[edges[i].first] = i; } auto nxt = [&](int u, int v) { if (u == v) return -1; if (is_ancestor(u, v)) { /*for (int i : g[u]) { if (par[u] != i && is_ancestor(i, v)) { return i; } }*/ cerr << u << " " << v << " " << get_next(u, v) << endl; return get_next(u, v); } else { return up[u][0]; } }; for (int i = 1; i <= m; i++) { auto [u, v] = edges[i]; while (u != -1) { if (e[u] && e[u] != i) { g2[i].emplace_back(e[u]); } if (s[u] && s[u] != i) { g2[s[u]].emplace_back(i); } u = nxt(u, v); } } function<void(int,int)> mv = [&](int idx, int p) { if (!ok) return; int v = nxt(edges[idx].first, edges[idx].second); if (v == -1 || v == p) { ok = false; return; } if (hv[v]) { mv(hv[v], edges[idx].first); } hv[edges[idx].first] = 0; hv[v] = idx; edges[idx].first = v; }; stack<int> top; for (int i = 1; i <= m; i++) { if (col[i] == 0) dfs2(i, top); } while (!top.empty() && ok) { int i = top.top(); top.pop(); while (edges[i].first != edges[i].second && ok) { mv(i, -1); } } cout << (ok?"Yes\n":"No\n"); } int main() { ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { solve(); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...