Submission #1130066

#TimeUsernameProblemLanguageResultExecution timeMemory
1130066beabossJail (JOI22_jail)C++20
49 / 100
2791 ms1114112 KiB
#include "bits/stdc++.h" using namespace std; #define s second #define f first #define pb push_back typedef long long ll; typedef pair<int, int> pii; typedef vector<pii> vpii; typedef vector<int> vi; #define FOR(i, a, b) for (int i = (a); i<b; i++) bool ckmin(int& a, int b){ return b < a ? a = b, true : false; } bool ckmax(int& a, int b){ return b > a ? a = b, true : false; } const int N = 12e4; vi adj[N]; vi dag[N]; bool vis[N]; int in[N], out[N]; int st[N], en[N], indeg[N]; int timer = 0; int par[N]; void dfs(int cur, int p = 0) { par[cur]=p; in[cur] = timer++; for (auto val: adj[cur]) { if (val != p) dfs(val, cur); } out[cur]=timer; } bool is_anc(int a, int b) { return in[a] <= in[b] && out[a] >= out[b]; } void upd_dag(int ind, int start, int end) { // cout << start << end << endl; vi path = {start}; while (!is_anc(start, end)) { // cout << start << endl; start=par[start]; path.pb(start); } // cout << start << end << par[end] << endl; while (end != start) { // cout << end << endl; path.pb(end); end=par[end]; } for (auto x: path) { if (en[x] && ind != en[x]) { indeg[en[x]]++; // cout << ind << ' ' << en[x] << endl; dag[ind].pb(en[x]); } if (st[x] && ind != st[x]) { indeg[ind]++; // cout << st[x] << ' ' << ind << endl; dag[st[x]].pb(ind); } } // cout << endl; } bool trav_dag(int cur) { // cout << cur << endl; if (vis[cur]) return false; vis[cur]=true; bool fail=false; for (auto val: dag[cur]) { indeg[val]--; if (indeg[val] == 0) fail |= trav_dag(val); } return fail; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n; cin >> n; FOR(i, 1, n+1) { adj[i].clear(); st[i] = en[i]=0; dag[i].clear(); vis[i]=false; indeg[i]=0; } FOR(i, 1, n) { int x, y; cin >> x >> y; adj[x].pb(y); adj[y].pb(x); } dfs(1); int m; cin >> m; vpii paths(m); FOR(i, 0, m) { cin >> paths[i].f >> paths[i].s; st[paths[i].f]=i+1; en[paths[i].s]=i+1; } // cout << 'd' << endl; FOR(i, 0, paths.size()) upd_dag(i + 1, paths[i].f, paths[i].s); bool works=true; // cout << 'd' << endl; FOR(i, 1, m+1) { if (indeg[i] == 0) { // cout << i << endl; works &= !trav_dag(i); } } FOR(i, 1, m+1) works &= vis[i]; if (works) cout << "Yes" << endl; else cout << "No" << endl; } }
#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...