Submission #890816

#TimeUsernameProblemLanguageResultExecution timeMemory
890816vjudge1Jail (JOI22_jail)C++17
61 / 100
225 ms32424 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ar array #define pb push_back #define ln '\n' #define int long long using i64 = long long; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } void solve(){ int n; cin >> n; vector <vector<int>> G(n); bool Qflag = true; for ( int i = 0; i + 1 < n; i++ ){ int u, v; cin >> u >> v; --u, --v; G[u].pb(v), G[v].pb(u); Qflag &= (u + 1 == v); } 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]; } if ( Qflag ){ vector <int> pf(n + 1); vector <ar<int,2>> A; for ( int i = 0; i < m; i++ ){ if ( S[i] > T[i] ){ pf[T[i]]++; pf[S[i] + 1]--; } A.pb({min(S[i], T[i]), max(S[i], T[i])}); } for ( int i = 1; i < n; i++ ){ pf[i] += pf[i - 1]; } for ( int i = 0; i < m; i++ ){ if ( S[i] < T[i] ){ int s = pf[T[i]] - (S[i] ? pf[S[i] - 1] : 0); if ( s ){ cout << "No\n"; return; } } } sort(all(A)); int mx = -1; for ( auto &[l, r]: A ){ if ( mx >= r ){ cout << "No\n"; return; } chmax(mx, r); } cout << "Yes\n"; return; } vector <vector<int>> up(20, vector <int> (n)); vector <int> d(n), tin(n), tout(n); int timer = 0; auto dfs = [&](auto dfs, int u, int p) -> void{ up[0][u] = p; for ( int i = 1; i < 20; i++ ){ up[i][u] = up[i - 1][up[i - 1][u]]; } tin[u] = ++timer; for ( auto &v: G[u] ){ if ( v != p ){ d[v] = d[u] + 1; dfs(dfs, v, u); } } tout[u] = timer; }; dfs(dfs, 0, 0); auto lca = [&](int u, int v){ if ( d[u] < d[v] ) swap(u, v); int df = d[u] - d[v]; for ( int i = 0; i < 20; i++ ){ if ( df >> i & 1 ){ u = up[i][u]; } } if ( u == v ){ return u; } for ( int i = 19; i >= 0; i-- ){ if ( up[i][u] != up[i][v] ){ u = up[i][u]; v = up[i][v]; } } return up[0][u]; }; auto isPar = [&](int u, int v){ return tin[u] <= tin[v] && tout[u] >= tout[v]; }; auto onPath = [&](int u, int x, int v){ return (isPar(x, u) || isPar(x, v)) && isPar(lca(u, v), x); }; auto bad = [&](int j, int i){ return onPath(S[i], S[j], T[i]) || onPath(S[j], T[i], T[j]); }; vector <vector<int>> P(m); for ( int i = 0; i < m; i++ ){ for ( int j = i + 1; j < m; j++ ){ if ( bad(i, j) ){ P[i].pb(j); } if ( bad(j, i) ){ P[j].pb(i); } } } vector <int> us(m); auto dfs2 = [&](auto dfs2, int u) -> bool{ us[u] = 1; for ( auto &v: P[u] ){ if ( !us[v] ){ if ( !dfs2(dfs2, v) ){ return false; } } else if ( us[v] == 1 ){ return false; } } us[u] = 2; return true; }; bool flag = true; for ( int i = 0; i < m; i++ ){ if ( !us[i] ){ flag &= dfs2(dfs2, i); } } cout << (flag ? "Yes\n" : "No\n"); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while ( t-- ){ solve(); } cout << '\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...