Submission #636208

#TimeUsernameProblemLanguageResultExecution timeMemory
636208Yazan_AlattarJail (JOI22_jail)C++14
0 / 100
6 ms9728 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define F first #define S second #define pb push_back #define endl "\n" #define all(x) x.begin(), x.end() const int M = 200007; const ll inf = 1e9; const ll INF = 1e18; const ll mod = 1e9 + 7; const double pi = acos(-1); const double eps = 1e-6; const int dx[] = {0, -1, 0, 1}, dy[] = {1, 0, -1, 0}; const int block = 320; vector <int> adj[M], to[M]; int n, m, s[M], t[M], dep[M], anc[M][30], in[M], st[M], out[M], timer; bool con(int i, int j){ return st[i] <= st[j] && out[i] >= out[j]; } int lca(int x, int y){ if(x == y) return x; if(dep[x] > dep[y]) swap(x, y); for(int i = 18; i >= 0; --i) if(dep[anc[y][i]] >= dep[x]) y = anc[y][i]; if(x == y) return x; for(int i = 18; i >= 0; --i) if(anc[x][i] != anc[y][i]){ x = anc[x][i]; y = anc[y][i]; } return anc[x][0]; } bool check(int i, int j){ if(!con(s[i], s[j]) && !con(t[i], s[j]) && con(lca(s[i], t[i]), s[j])) return 0; if(!con(s[j], t[i]) && !con(t[j], t[i]) && con(lca(s[j], t[j]), t[i])) return 0; return 1; } void dfs(int node, int par){ st[node] = ++timer; for(auto i : adj[node]) if(i != par){ dep[i] = dep[node] + 1; anc[i][0] = node; dfs(i, node); } out[node] = ++timer; return; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin >> q; while(q--){ cin >> n; for(int i = 1; i < n; ++i){ int x, y; cin >> x >> y; adj[x].pb(y); adj[y].pb(x); } dep[1] = 1; dfs(1, 0); for(int j = 1; j < 19; ++j) for(int i = 1; i <= n; ++i) anc[i][j] = anc[anc[i][j - 1]][j - 1]; cin >> m; for(int i = 1; i <= m; ++i) cin >> s[i] >> t[i]; for(int i = 1; i <= m; ++i){ for(int j = 1; j <= m; ++j){ if(i != j && !check(i, j)) to[j].pb(i), ++in[i]; } } queue <int> q; for(int i = 1; i <= m; ++i) if(!in[i]) q.push(i); int cnt = 0; while(!q.empty()){ int node = q.front(); q.pop(); ++cnt; for(auto i : to[node]){ --in[i]; if(!in[i]) q.push(i); } } cout << (cnt != m ? "No\n" : "Yes\n"); for(int i = 1; i <= n; ++i){ adj[i].clear(); to[i].clear(); in[i] = 0; } } 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...