Submission #994199

#TimeUsernameProblemLanguageResultExecution timeMemory
994199vjudge1Jail (JOI22_jail)C++17
61 / 100
5041 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 120'001; vector<int> g[MAXN], g2[MAXN]; int tin[MAXN], tout[MAXN], s[MAXN], e[MAXN], par[MAXN], col[MAXN], hv[MAXN], timer; bool ok; void dfs(int u, int p = -1) { tin[u] = timer++; par[u] = p; for (int v : g[u]) { if (v != p) dfs(v, u); } tout[u] = timer++; } void dfs2(int u, stack<int> &top) { col[u] = 1; for (int v : g2[u]) { if (col[v] == 0) dfs2(v, top); else if (col[v] == 1) ok = false; } col[u] = 2; top.push(u); } bool is_ancestor(int u, int v) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } void solve() { int n; cin >> n; ok = true; fill(s, s+n+1, 0); fill(e, e+n+1, 0); fill(col, col+n+1, 0); fill(hv, hv+n+1, 0); timer = 1; for (int i = 1; i <= n; i++) { g[i].clear(); g2[i].clear(); } for (int i = 0; i < n-1; i++) { int u, v; cin >> u >> v; g[u].emplace_back(v); g[v].emplace_back(u); } dfs(1); int m; cin >> m; vector<pair<int, int>> edges(m+1); for (int i = 1; i <= m; i++) { cin >> edges[i].first >> edges[i].second; auto [u, v] = edges[i]; s[u] = e[v] = i; hv[edges[i].first] = i; } auto nxt = [&](int u, int v) { if (u == v) return -1; if (is_ancestor(u, v)) { for (int i : g[u]) { if (par[u] != i && is_ancestor(i, v)) { return i; } } } else { return par[u]; } }; for (int i = 1; i <= m; i++) { auto [u, v] = edges[i]; while (u != -1) { if (e[u] && e[u] != i) { g2[i].emplace_back(e[u]); } if (s[u] && s[u] != i) { g2[s[u]].emplace_back(i); } u = nxt(u, v); } } function<void(int,int)> mv = [&](int idx, int p) { if (!ok) return; int v = nxt(edges[idx].first, edges[idx].second); if (v == -1 || v == p) { ok = false; return; } if (hv[v]) { mv(hv[v], edges[idx].first); } hv[edges[idx].first] = 0; hv[v] = idx; edges[idx].first = v; }; stack<int> top; for (int i = 1; i <= m; i++) { if (col[i] == 0) dfs2(i, top); } while (!top.empty() && ok) { int i = top.top(); top.pop(); while (edges[i].first != edges[i].second && ok) { mv(i, -1); } } cout << (ok?"Yes\n":"No\n"); } int main() { ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { solve(); } return 0; }

Compilation message (stderr)

jail.cpp: In lambda function:
jail.cpp:73:5: warning: control reaches end of non-void function [-Wreturn-type]
   73 |     };
      |     ^
#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...