Submission #592632

#TimeUsernameProblemLanguageResultExecution timeMemory
592632MilosMilutinovicJail (JOI22_jail)C++14
5 / 100
5042 ms3352 KiB
/** * author: wxhtzdy * created: 08.07.2022 12:20:42 **/ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int tt; cin >> tt; while (tt--) { int n; cin >> n; vector<vector<int>> g(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); } int m; cin >> m; vector<int> s(m), t(m); for (int i = 0; i < m; i++) { cin >> s[i] >> t[i]; --s[i]; --t[i]; } const int L = 20; vector<vector<int>> jump(n, vector<int>(L)); vector<int> dep(n); vector<int> tin(n); vector<int> tout(n); int T = 0; function<void(int, int)> Dfs = [&](int v, int pr) { dep[v] = dep[pr] + 1; tin[v] = ++T; jump[v][0] = pr; for (int u : g[v]) { if (u != pr) { Dfs(u, v); } } tout[v] = T; }; Dfs(0, 0); for (int j = 1; j < L; j++) { for (int i = 0; i < n; i++) { jump[i][j] = jump[jump[i][j - 1]][j - 1]; } } auto LCA = [&](int u, int v) { if (dep[u] < dep[v]) { swap(u, v); } for (int i = L - 1; i >= 0; i--) { if (dep[jump[u][i]] >= dep[v]) { u = jump[u][i]; } } for (int i = L - 1; i >= 0; i--) { if (jump[u][i] != jump[v][i]) { u = jump[u][i]; v = jump[v][i]; } } return u == v ? u : jump[u][0]; }; auto isPar = [&](int a, int b) { return tin[a] <= tin[b] && tout[b] <= tout[a]; }; auto onPath = [&](int a, int b, int c) { int L = LCA(b, c); return isPar(L, a) && (isPar(a, b) || isPar(a, c)); }; vector<vector<bool>> f(m, vector<bool>(m)); for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (i == j) { continue; } if (onPath(s[j], s[i], t[i])) { f[i][j] = true; } if (onPath(t[j], s[i], t[i])) { f[j][i] = true; } } } bool ok = true; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { if (i == j) { continue; } if (f[i][j] && f[j][i]) { ok = false; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { for (int k = 0; k < m; k++) { if (i == j || i == k || j == k) { continue; } if (f[i][j] && f[j][k] && f[k][i]) { ok = false; } } } } cout << (ok ? "Yes" : "No") << '\n'; } 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...