Submission #567495

#TimeUsernameProblemLanguageResultExecution timeMemory
567495maomao90Jail (JOI22_jail)C++17
100 / 100
2290 ms641032 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> using namespace std; template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} #define REP(i, s, e) for (int i = s; i < e; i++) #define RREP(i, s, e) for (int i = s; i >= e; i--) typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 200005; const int MAXL = 20; int q; int n, m; vi adj[MAXN], radj[MAXN * 80]; int s[MAXN], t[MAXN]; int mps[MAXN], mpt[MAXN]; int p[MAXL][MAXN], id[MAXL][MAXN], ptr; int lvl[MAXN]; void dfs(int u, int cp) { p[0][u] = cp; REP (k, 1, MAXL) { if (p[k - 1][u] == -1) { p[k][u] = -1; id[k][u] = -1; } else { p[k][u] = p[k - 1][p[k - 1][u]]; id[k][u] = ptr; radj[id[k - 1][u]].pb(id[k][u]); radj[id[k][u] ^ 1].pb(id[k - 1][u] ^ 1); if (id[k - 1][p[k - 1][u]] != -1) { radj[id[k - 1][p[k - 1][u]]].pb(id[k][u]); radj[id[k][u] ^ 1].pb(id[k - 1][p[k - 1][u]] ^ 1); } ptr += 2; } } for (int v : adj[u]) { if (v == cp) continue; lvl[v] = lvl[u] + 1; dfs(v, u); } } int vis[MAXN * 80]; bool cyc; void rdfs(int u) { vis[u] = 1; for (int v : radj[u]) { if (vis[v] == 1) { cyc = 1; } else if (!vis[v]) { rdfs(v); } } vis[u] = 2; } int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> q; while (q--) { cin >> n; REP (i, 0, n + 1) { adj[i].clear(); mps[i] = 0, mpt[i] = 0; REP (j, 0, MAXL) { id[j][i] = -1; p[j][i] = -1; } } REP (i, 1, n) { int a, b; cin >> a >> b; adj[a].pb(b); adj[b].pb(a); } cin >> m; ptr = m; if (ptr & 1) { ptr++; } REP (i, 1, n + 1) { id[0][i] = ptr; ptr += 2; } REP (i, 0, m) { cin >> s[i] >> t[i]; mps[s[i]] = i, mpt[t[i]] = i; radj[i].pb(id[0][s[i]]); radj[id[0][t[i]] ^ 1].pb(i); } dfs(1, -1); REP (i, 0, m) { int u = s[i], v = t[i]; if (mpt[u] != 0) { radj[i].pb(mpt[u]); } if (mps[v] != 0) { radj[mps[v]].pb(i); } if (lvl[u] < lvl[v]) { swap(u, v); } auto jump = [&] (int &u, int k) { radj[id[k][u]].pb(i); radj[i].pb(id[k][u] ^ 1); u = p[k][u]; }; u = p[0][u]; RREP (k, MAXL - 1, 0) { if (p[k][u] == -1) continue; if (lvl[p[k][u]] >= lvl[v]) { jump(u, k); } } bool hasj = 0; if (lvl[u] < lvl[v]) { hasj = 1; v = p[0][v]; } if (u == v) { if (hasj) { jump(u, 0); } continue; } if (hasj) { jump(v, 0); } else { v = p[0][v]; } jump(u, 0); RREP (k, MAXL - 1, 0) { if (p[k][u] != p[k][v]) { jump(u, k); jump(v, k); } } if (u != v) { jump(u, 0); jump(v, 0); } assert(u == v); jump(u, 0); } cyc = 0; REP (i, 0, m) { if (vis[i]) continue; rdfs(i); if (cyc) { break; } } if (cyc) { cout << "No\n"; } else { cout << "Yes\n"; } REP (i, 0, ptr) { radj[i].clear(); vis[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...