제출 #624217

#제출 시각아이디문제언어결과실행 시간메모리
624217boris_mihovJail (JOI22_jail)C++14
72 / 100
5034 ms586544 KiB
#include <algorithm> #include <iostream> #include <numeric> #include <vector> typedef long long llong; const int MAXN = 300000 + 10; const int INF = 2e9; int n, q; int parent[MAXN]; int in[MAXN], out[MAXN], timer; int begin[MAXN], end[MAXN]; std::vector <int> g[MAXN]; std::vector <int> v[MAXN]; int from[MAXN], to[MAXN]; void initDFS(int node, int p) { parent[node] = p; in[node] = ++timer; for (const int &i : g[node]) { if (i == p) continue; initDFS(i, node); } out[node] = ++timer; } inline bool inSubtree(int x, int y) { return in[y] <= in[x] && out[x] <= out[y]; } void cyclePath(int start, int finish, int num) { if (inSubtree(start, finish)) { if (begin[start] != 0 && begin[start] != num) { v[num].push_back(begin[start]); } if (end[start] != 0 && end[start] != num) { v[end[start]].push_back(num); } if (start != finish) cyclePath(parent[start], finish, num); } else { if (begin[finish] != 0 && begin[finish] != num) { v[num].push_back(begin[finish]); } if (end[finish] != 0 && end[finish] != num) { v[end[finish]].push_back(num); } cyclePath(start, parent[finish], num); } } int vis[MAXN]; bool findCycle(int node) { vis[node] = 1; for (const int &i : v[node]) { if (vis[i] == 2) continue; if (vis[i] == 1) return true; if (findCycle(i)) return true; } vis[node] = 2; return false; } void solve() { initDFS(1, 0); for (int i = 1 ; i <= q ; ++i) { if (from[i] == to[i]) continue; cyclePath(from[i], to[i], i); } for (int i = 1 ; i <= q ; ++i) { if (vis[i] == 2) continue; if (findCycle(i)) { std::cout << "No\n"; return; } } std::cout << "Yes\n"; } void read() { int x, y; std::cin >> n; for (int i = 2 ; i <= n ; ++i) { std::cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } std::cin >> q; for (int i = 1 ; i <= q ; ++i) { std::cin >> from[i] >> to[i]; begin[from[i]] = i; end[to[i]] = i; } } void reset() { for (int i = 1 ; i <= std::max(n, q) ; ++i) { g[i].clear(); v[i].clear(); begin[i] = 0; end[i] = 0; vis[i] = 0; timer = 0; } } void fastIO() { std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int tests; int main() { fastIO(); std::cin >> tests; while (tests--) { reset(); read(); 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...