Submission #867055

#TimeUsernameProblemLanguageResultExecution timeMemory
867055nima_aryanJail (JOI22_jail)C++17
72 / 100
4491 ms1048580 KiB
/** * author: NimaAryan * created: 2023-10-12 11:20:40 **/ #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast,unroll-loops") #ifdef LOCAL #include "algo/debug.h" #endif using i64 = long long; void solve() { int N; cin >> N; vector<vector<int>> t(N); for (int i = 0; i < N - 1; ++i) { int A, B; cin >> A >> B; --A, --B; t[A].push_back(B); t[B].push_back(A); } vector up(20, vector<int>(N, -1)); vector<int> par(N); vector<int> dep(N); auto reroot = [&](auto self, int v, int p) -> void { up[0][v] = par[v] = p; for (int k = 1; k < 20; ++k) { int mid = up[k - 1][v]; if (mid != -1) { up[k][v] = up[k - 1][mid]; } } for (int u : t[v]) { if (u != p) { dep[u] = dep[v] + 1; self(self, u, v); } } }; reroot(reroot, 0, -1); int M; cin >> M; vector<int> S(M), T(M); vector<int> whoS(N, -1), whoT(N, -1); for (int i = 0; i < M; ++i) { cin >> S[i] >> T[i]; --S[i], --T[i]; whoS[S[i]] = whoT[T[i]] = i; } auto jump = [&](int a, int x) { int at = a; for (int k = 0; k < 20; ++k) { if (x >> k & 1) { at = up[k][at]; if (at == -1) { break; } } } return at; }; auto LCA = [&](int a, int b) { if (dep[a] < dep[b]) { swap(a, b); } a = jump(a, dep[a] - dep[b]); if (a == b) { return a; } for (int k = 20 - 1; k >= 0; --k) { int na = up[k][a]; int nb = up[k][b]; if (na != nb) { a = na; b = nb; } } return par[a]; }; vector<vector<int>> h(M); for (int i = 0; i < M; ++i) { auto [s, t] = pair(S[i], T[i]); int lca = LCA(s, t); vector<int> path{lca}; while (s != lca) { path.push_back(s); s = par[s]; } while (t != lca) { path.push_back(t); t = par[t]; } for (int x : path) { if (whoS[x] != -1 && whoS[x] != i) { h[i].push_back(whoS[x]); } if (whoT[x] != -1 && whoT[x] != i) { h[whoT[x]].push_back(i); } } } vector<int> vis(M); bool fail = false; auto dfs = [&](auto self, int v) -> void { vis[v] = 1; for (int u : h[v]) { if (!vis[u]) { self(self, u); } else if (vis[u] == 1) { fail = true; } } vis[v] = 2; }; for (int i = 0; i < M; ++i) { if (!vis[i]) { dfs(dfs, i); } } cout << (fail ? "No" : "Yes") << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; while (Q--) { 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...