제출 #1168427

#제출 시각아이디문제언어결과실행 시간메모리
1168427aycnlJail (JOI22_jail)C++20
100 / 100
741 ms91388 KiB
#include <bits/stdc++.h> using namespace std; #define ii pair <int, int> #define ff first #define ss second #define bit(i) (1 << (i)) #define fto(i, a, b) for (int i = (a); i <= (b); ++i) #define fdto(i, a, b) for (int i = (a); i >= (b); --i) #define flto(i, a, b) for (int i = (a); (1 << i) <= (b); ++i) #define pb push_back #define pf push_front #define endl "\n" #define oo (int)(1e9 + 7) #define maxN 120005 #define l(s) s.length() #define vi vector <int> #define vii vector <ii> #define fat(x, y) for (auto x : y) #define fit(x, y) for (int x : y) #define fiit(x, y) for (ii x : y) #define EPS 1e-9 #define pi (acos(-1)) #define ll long long int n, m, tme, cnt, c1, c2; vi ke[maxN], adj[10*maxN]; int s[maxN], t[maxN]; int par[maxN], h[maxN], pos[maxN], top[maxN], sz[maxN]; int ps[maxN], pt[maxN]; int deg[10*maxN], vst[10*maxN]; int fn1[4*maxN], fn2[4*maxN]; void pre_dfs(int u) { sz[u] = 1; for (int v : ke[u]) if (v != par[u]) { par[v] = u; h[v] = h[u] + 1; pre_dfs(v); sz[u] += sz[v]; } } void hld(int u, int tp) { pos[u] = ++tme; top[u] = tp; //cout << u << endl; int bigC = 0; for (int v : ke[u]) if (v != par[u]) { if (sz[v] > sz[bigC]) bigC = v; } if (bigC) hld(bigC, tp); for (int v : ke[u]) if (v != par[u]) { if (v != bigC) hld(v, v); } } void build1(int id, int l, int r) { fn1[id] = ++cnt; if (l == r) { if (ps[l]) { adj[ps[l]].pb(fn1[id]); deg[fn1[id]]++; } return; } int m = (l+r)/2; build1(id*2, l, m); build1(id*2+1, m+1, r); adj[fn1[id*2]].pb(fn1[id]); adj[fn1[id*2+1]].pb(fn1[id]); deg[fn1[id]] += 2; } void build2(int id, int l, int r) { fn2[id] = ++cnt; if (l == r) { if (pt[l]) { adj[fn2[id]].pb(pt[l]); deg[pt[l]]++; } return; } int m = (l+r)/2; build2(id*2, l, m); build2(id*2+1, m+1, r); adj[fn2[id]].pb(fn2[id*2]); adj[fn2[id]].pb(fn2[id*2+1]); deg[fn2[id*2]]++; deg[fn2[id*2+1]]++; } void f1add(int id, int l, int r, int i, int j, int x) { if (l > j || r < i) return; if (i <= l && r <= j) { adj[fn1[id]].pb(x); deg[x]++; return; } //cout << l << " " << r << endl; int m = (l+r)/2; f1add(id*2, l, m, i, j, x); f1add(id*2+1, m+1, r, i, j, x); } void f2add(int id, int l, int r, int i, int j, int x) { if (l > j || r < i) return; if (i <= l && r <= j) { adj[x].pb(fn2[id]); deg[fn2[id]]++; return; } int m = (l+r)/2; f2add(id*2, l, m, i, j, x); f2add(id*2+1, m+1, r, i, j, x); } void fquery(int u, int v, int i) { //cout << u << " " << v << endl; int x = u, y = v; //cout << u << " " << v << endl; while (top[x] != top[y]) { //cout << 1 << endl; if (h[top[x]] < h[top[y]]) swap(x, y); //cout << x << " " << y << endl; f1add(1, 1, n, pos[top[x]] + (top[x] == u), pos[x] - (x == u) , i); f2add(1, 1, n, pos[top[x]] + (top[x] == v), pos[x] - (x == v), i); x = par[top[x]]; } //cout << u << " " << v << endl; if (pos[x] > pos[y]) swap(x, y); f1add(1, 1, n, pos[x] + (x == u), pos[y] - (y == u), i); f2add(1, 1, n, pos[x] + (x == v), pos[y] - (y == v), i); } void solve() { cin >> n; fto(i, 1, n) { ke[i].clear(); ps[i] = pt[i] = 0; } fto(i, 1, n-1) { int u, v; cin >> u >> v; ke[u].pb(v); ke[v].pb(u); } tme = 0; pre_dfs(1); hld(1, 1); cin >> m; fto(i, 1, m) { cin >> s[i] >> t[i]; ps[pos[s[i]]] = i; pt[pos[t[i]]] = i; } fto(i, 1, 8*n + m) deg[i] = 0, adj[i].clear(); cnt = m; build1(1, 1, n); build2(1, 1, n); //return; fto(i, 1, m) { //cout << i << endl; fquery(s[i], t[i], i); } int vis = 0; queue<int> q; fto(i, 1, cnt) if (!deg[i]) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); //cout << u << endl; ++vis; for (int v : adj[u]) { --deg[v]; if (deg[v] == 0) q.push(v); } } //fto(i, 1, cnt) cout << deg[i] << " "; cout << endl; if (vis == cnt) { cout << "Yes" << endl; } else { //cout << vis << " " << cnt << endl; cout << "No" << endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int test; cin >> test; while (test--) 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...