Submission #882513

#TimeUsernameProblemLanguageResultExecution timeMemory
882513LucaIlieJail (JOI22_jail)C++17
72 / 100
3783 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; struct prisoner { int b, w; }; const int MAX_N = 1.2e5; const int MAX_M = MAX_N; int parent[MAX_N + 1], depth[MAX_N + 1], bedroom[MAX_N + 1], workroom[MAX_N + 1], in[MAX_N + 1]; vector <int> edges[MAX_N + 1], g[MAX_M + 1]; prisoner prisoners[MAX_M + 1]; void dfs( int u, int p ) { depth[u] = depth[p] + 1; parent[u] = p; for ( int v: edges[u] ) { if ( v == p ) continue; dfs( v, u ); } } int main() { int t; cin >> t; while ( t-- ) { int n, m; cin >> n; for ( int v = 1; v <= n; v++ ) { edges[v].clear(); workroom[v] = 0; bedroom[v] = 0; } for ( int i = 0; i < n - 1; i++ ) { int u, v; cin >> u >> v; edges[u].push_back( v ); edges[v].push_back( u ); } cin >> m; for ( int i = 1; i <= m; i++ ) { g[i].clear(); in[i] = 0; } for ( int i = 1; i <= m; i++ ) cin >> prisoners[i].b >> prisoners[i].w; dfs( 1, 0 ); for ( int i = 1; i <= m; i++ ) { bedroom[prisoners[i].b] = i; workroom[prisoners[i].w] = i; } for ( int i = 1; i <= m; i++ ) { int u = prisoners[i].b, v = prisoners[i].w; if ( depth[u] < depth[v] ) swap( u, v ); while ( depth[u] > depth[v] ) { if ( bedroom[u] != 0 && bedroom[u] != i ) g[bedroom[u]].push_back( i ); if ( workroom[u] != 0 && workroom[u] != i ) g[i].push_back( workroom[u] ); u = parent[u]; } while ( u != v ) { if ( bedroom[u] != 0 && bedroom[u] != i ) g[bedroom[u]].push_back( i ); if ( workroom[u] != 0 && workroom[u] != i ) g[i].push_back( workroom[u] ); if ( bedroom[v] != 0 && bedroom[v] != i ) g[bedroom[v]].push_back( i ); if ( workroom[v] != 0 && workroom[v] != i ) g[i].push_back( workroom[v] ); u = parent[u]; v = parent[v]; } if ( bedroom[u] != 0 && bedroom[u] != i ) g[bedroom[u]].push_back( i ); if ( workroom[u] != 0 && workroom[u] != i ) g[i].push_back( workroom[u] ); } for ( int i = 1; i <= m; i++ ) { sort( g[i].begin(), g[i].end() ); g[i].resize( unique( g[i].begin(), g[i].end() ) - g[i].begin() ); for ( int j: g[i] ) in[j]++; } queue <int> q; for ( int i = 1; i <= m; i++ ) { if ( in[i] == 0 ) q.push( i ); } int pasi = 0; while ( !q.empty() ) { int u = q.front(); q.pop(); pasi++; for ( int v: g[u] ) { in[v]--; if ( in[v] == 0 ) q.push( v ); } } cout << (pasi == m ? "Yes\n" : "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...