Submission #949905

#TimeUsernameProblemLanguageResultExecution timeMemory
949905vladiliusJail (JOI22_jail)C++17
0 / 100
1 ms456 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; struct FT{ vector<int> bit; int n; FT(int ns){ n = ns; bit.resize(n + 1); } int get(int v){ int out = 0; while (v > 0){ out += bit[v]; v = (v & (v + 1)) - 1; } return out; } void upd(int v, int k){ while (v <= n){ bit[v] += k; v |= (v + 1); } } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin>>q; while (q--){ int n; cin>>n; vector<int> g[n + 1]; for (int i = 1; i < n; i++){ int a, b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } int m; cin>>m; vector<int> s(m + 1), t(m + 1); vector<bool> used(n + 1); for (int i = 1; i <= m; i++){ cin>>s[i]>>t[i]; used[s[i]] = i; } vector<int> tin(n + 1), tout(n + 1), p(n + 1); int lg = ceil(log2(n)) + 1; vector<int> pw[n + 1]; for (int i = 1; i <= n; i++){ pw[i].resize(lg); } int timer = 0; function<void(int, int, int)> fill = [&](int v, int pr, int k){ p[v] = k; if (used[v]) k = v; tin[v] = ++timer; pw[v][0] = pr; for (int i = 1; i < lg; i++){ pw[v][i] = pw[pw[v][i - 1]][i - 1]; } for (int i: g[v]){ if (i == pr) continue; fill(i, v, k); } tout[v] = timer; }; fill(1, 1, 0); auto check = [&](int x, int y){ return (tin[x] <= tin[y] && tout[x] >= tout[y]); }; auto lca = [&](int x, int y){ if (check(x, y)) return x; if (check(y, x)) return y; for (int i = lg - 1; i >= 0; i--){ if (!check(pw[x][i], y)){ x = pw[x][i]; } } return pw[x][0]; }; vector<int> l(m + 1); for (int i = 1; i <= m; i++){ l[i] = lca(s[i], t[i]); } vector<bool> ban(n + 1); function<int(int)> get = [&](int v){ if (!v) return 0; if (used[v] && !ban[v]){ p[v] = p[pw[v][0]]; ban[v] = true; return v; } return p[v] = get(p[v]); }; vector<int> order; function<void(int)> dfs = [&](int v){ int x; while (check(l[v], x = get(s[v]))){ dfs(used[x]); } while (check(l[v], x = get(t[v]))){ dfs(used[x]); } order.push_back(v); }; FT T(n); auto upd = [&](int i, int k){ T.upd(tin[s[i]], k); T.upd(tout[s[i]] + 1, -k); }; for (int i = 1; i <= m; i++){ upd(i, 1); } auto sum = [&](int i){ return T.get(tin[s[i]]) + T.get(tin[t[i]]) - 2 * T.get(tin[l[i]]) + (T.get(tin[l[i]]) - T.get(tin[pw[l[i]][0]])); }; vector<pii> a; for (int i = 1; i <= m; i++){ a.push_back({sum(i), i}); } sort(a.begin(), a.end(), greater<pii>()); for (auto [x, i]: a){ dfs(i); } reverse(order.begin(), order.end()); bool out = true; for (int i: order){ if (sum(i) > 1){ out = false; break; } upd(i, -1); } cout<<((out == true) ? "Yes" : "No")<<"\n"; } }
#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...