Submission #962466

#TimeUsernameProblemLanguageResultExecution timeMemory
962466huutuanJail (JOI22_jail)C++14
77 / 100
5067 ms227020 KiB
#include<bits/stdc++.h> using namespace std; // #define int long long #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define isz(x) ((int)x.size()) #define sumof(x) accumulate(all(x), 0ll) const int N=2e5+10, LG=18; vector<int> gg[N*6]; int idx[2][N*6], pos[2][N]; int deg[N*6]; struct SegmentTree{ int n, m; void init(int _n){ n=_n; m=n*2; } void build(int k, int l, int r, int ps[N], int pt[N]){ if (l==r){ idx[0][k]=pt[l]; idx[1][k]=ps[l]?ps[l]+n:0; if (pt[l]) pos[0][pt[l]]=l; if (ps[l]) pos[1][ps[l]]=l; return; } idx[0][k]=++m; idx[1][k]=++m; int mid=(l+r)>>1; build(k<<1, l, mid, ps, pt); build(k<<1|1, mid+1, r, ps, pt); if (idx[0][k<<1]) gg[idx[0][k]].push_back(idx[0][k<<1]), ++deg[idx[0][k<<1]]; if (idx[0][k<<1|1]) gg[idx[0][k]].push_back(idx[0][k<<1|1]), ++deg[idx[0][k<<1|1]]; if (idx[1][k<<1]) gg[idx[1][k<<1]].push_back(idx[1][k]), ++deg[idx[1][k]]; if (idx[1][k<<1|1]) gg[idx[1][k<<1|1]].push_back(idx[1][k]), ++deg[idx[1][k]]; } void update(int k, int l, int r, int L, int R, int i, bool type){ if (r<L || R<l) return; if (L<=l && r<=R){ if (!type){ if (idx[0][k]) gg[i+n].push_back(idx[0][k]), ++deg[idx[0][k]]; }else{ if (idx[1][k]) gg[idx[1][k]].push_back(i), ++deg[i]; } return; } int mid=(l+r)>>1; update(k<<1, l, mid, L, R, i, type); update(k<<1|1, mid+1, r, L, R, i, type); } void _update(int k, int l, int r, int L, int R, int i, bool type){ if (L<=pos[type][i] && pos[type][i]<=R){ update(k, l, r, L, pos[type][i]-1, i, type); update(k, l, r, pos[type][i]+1, R, i, type); }else update(k, l, r, L, R, i, type); } } st; int n, m, tin[N], tout[N], tdfs, dep[N], vis[N*6], par[N], head[N], sz[N]; pair<int, int> a[N]; int check; vector<int> g[N]; void dfs_sz(int u, int p){ if (p) g[u].erase(find(all(g[u]), p)); dep[u]=dep[p]+1; par[u]=p; sz[u]=1; for (int &v:g[u]){ dfs_sz(v, u); if (sz[v]>sz[g[u][0]]) swap(v, g[u][0]); } } void dfs_hld(int u, int h){ tin[u]=++tdfs; head[u]=h; for (int v:g[u]) dfs_hld(v, v==g[u][0]?h:v); tout[u]=tdfs; } void update(int u, int v, int i){ while (head[u]!=head[v]){ if (dep[head[u]]<dep[head[v]]) swap(u, v); st._update(1, 1, n, tin[head[u]], tin[u], i, 0); st._update(1, 1, n, tin[head[u]], tin[u], i, 1); u=par[head[u]]; } if (dep[u]>dep[v]) swap(u, v); st._update(1, 1, n, tin[u], tin[v], i, 0); st._update(1, 1, n, tin[u], tin[v], i, 1); } void dfs2(int u){ vis[u]=1; for (int v:gg[u]){ if (!vis[v]) dfs2(v); else if (vis[v]==1) check=0; } vis[u]=2; } int ps[N], pt[N]; void solve(){ check=1; cin >> n; for (int i=1; i<n; ++i){ int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs_sz(1, 0); dfs_hld(1, 1); cin >> m; for (int i=1; i<=m; ++i){ cin >> a[i].first >> a[i].second; ps[tin[a[i].first]]=i; pt[tin[a[i].second]]=i; } st.init(n); st.build(1, 1, n, ps, pt); for (int i=1; i<=m; ++i) gg[i].push_back(i+n), ++deg[i+n]; // for (int i=1; i<=n*6; ++i) for (int j:gg[i]) cout << i << ' ' << j << endl; for (int i=1; i<=m; ++i) update(a[i].first, a[i].second, i); // for (int i=1; i<=n*6; ++i) for (int j:gg[i]) cout << i << ' ' << j << endl; for (int i=1; i<=n*6; ++i) if (!deg[i]) dfs2(i); check&=accumulate(vis+1, vis+n*6+1, 0ll)==2*n*6; cout << (check?"Yes\n":"No\n"); for (int i=1; i<=n*6; ++i) g[i].clear(), gg[i].clear(), deg[i]=vis[i]=0, ps[i]=pt[i]=0; tdfs=0; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int ntests=1; cin >> ntests; for (int i=1; i<=ntests; ++i) 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...