제출 #1083650

#제출 시각아이디문제언어결과실행 시간메모리
1083650ShaShiJail (JOI22_jail)C++17
49 / 100
495 ms528040 KiB
#include <bits/stdc++.h> // #define int long long // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #define F first #define S second #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() #define kill(x) cout << x << "\n", exit(0); #define pii pair<int, int> #define endl "\n" using namespace std; typedef long long ll; typedef __int128_t lll; typedef long double ld; const int MAXN = (int)2e5 + 7; const int MOD = 998244353; const ll INF = (ll)1e9 + 7; const int LG = 20; int n, m, k, tmp, t, tmp2, tmp3, tmp4, u, v, w, flag, q, ans, flag2; pii arr[MAXN]; int par[MAXN], h[MAXN], pow2dad[MAXN][LG], fake_t[MAXN][LG], fake_s[MAXN][LG], ind_s[MAXN], ind_t[MAXN]; vector<int> adj[MAXN], G[MAXN*LG]; int seen[MAXN*LG]; inline void add_edge(int u, int v) { G[u].pb(v); } inline int up(int v, int k) { for (int i=LG-1; i>=0; i--) if (k >= (1<<i)) k -= (1<<i), v = pow2dad[v][i]; return v; } inline int LCA(int u, int v) { if (h[u] < h[v]) swap(u, v); u = up(u, h[u]-h[v]); if (u == v) return u; for (int i=LG-1; i>=0; i--) if (h[u] >= (1<<i) && pow2dad[u][i] != pow2dad[v][i]) u = pow2dad[u][i], v = pow2dad[v][i]; return pow2dad[u][0]; } void DFS(int v) { for (int u:adj[v]) { if (u == par[v]) continue; par[u] = v; h[u] = h[v]+1; DFS(u); } } void DFS2(int v) { seen[v] = 1; for (int u:G[v]) { if (seen[u] == 0) DFS2(u); else if (seen[u] == 1) tmp = 0; } seen[v] = 2; } inline void up_s(int v, int k, int ind) { // cout << "S : " << v << " " << k << " " << ind << endl; for (int i=LG-1; i>=0; i--) { if ((1<<i) <= k) { k -= (1<<i); add_edge(fake_s[v][i], ind); v = pow2dad[v][i]; } } } inline void up_t(int v, int k, int ind) { // cout << "T : " << v << " " << k << " " << ind << endl; for (int i=LG-1; i>=0; i--) { if ((1<<i) <= k) { k -= (1<<i); add_edge(ind, fake_t[v][i]); v = pow2dad[v][i]; } } } void solve() { cin >> n; for (int i=1; i<n; i++) { cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } cin >> m; for (int i=1; i<=m; i++) { cin >> u >> v; ind_s[u] = i; ind_t[v] = i; arr[i] = {u, v}; } DFS(1); flag = n+1; for (int i=1; i<=n; i++) { pow2dad[i][0] = par[i]; fake_s[i][0] = flag++; if (ind_s[i]) add_edge(ind_s[i], fake_s[i][0]); fake_t[i][0] = flag++; if (ind_t[i]) add_edge(fake_t[i][0], ind_t[i]); } for (int j=1; j<LG; j++) { for (int i=1; i<=n; i++) { pow2dad[i][j] = pow2dad[pow2dad[i][j-1]][j-1]; fake_s[i][j] = flag++; add_edge(fake_s[i][j-1], fake_s[i][j]); add_edge(fake_s[pow2dad[i][j-1]][j-1], fake_s[i][j]); fake_t[i][j] = flag++; add_edge(fake_t[i][j], fake_t[i][j-1]); add_edge(fake_t[i][j], fake_t[pow2dad[i][j-1]][j-1]); } } for (int i=1; i<=m; i++) { u = arr[i].F; v = arr[i].S; int lca = LCA(u, v); if (lca == u) { up_s(v, h[v]-h[u], i); up_t(par[v], h[v]-h[u], i); } else if (lca == v) { up_s(par[u], h[u]-h[v], i); up_t(u, h[u]-h[v], i); } else { up_s(par[u], h[u]-h[lca], i); up_t(u, h[u]-h[lca]+1, i); up_s(v, h[v]-h[lca]+1, i); up_t(par[v], h[v]-h[lca], i); } } tmp = 1; for (int i=1; i<=n; i++) { if (seen[i]) continue; DFS2(i); if (!tmp) break; } cout << (tmp? "Yes\n" : "No\n"); fill_n(seen, flag+7, 0); fill_n(ind_s, flag+7, 0); fill_n(ind_t, flag+7, 0); fill_n(par, flag+7, 0); for (int i=1; i<=flag+7; i++) adj[i].clear(), G[i].clear(); } int32_t main() { #ifdef LOCAL freopen("inp.in", "r", stdin); freopen("res.out", "w", stdout); #else ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #endif cin >> t; while (t--) 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...