Submission #1168595

#TimeUsernameProblemLanguageResultExecution timeMemory
1168595sitablechairJail (JOI22_jail)C++20
100 / 100
1509 ms355328 KiB
#include <bits/stdc++.h> #define ll long long #define ldb long double #define endl '\n' #define For(i,l,r) for(int i=l;i<=r;i++) #define ForD(i,r,l) for(int i=r;i>=l;i--) #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define sz(x) (signed)x.size() #define unq(x) x.resize(unique(all(x))-x.begin()) #define F "TASK" #define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout); #ifdef NCGM #include"debug.h" #else #define debug(...) "fr"; #endif using namespace std; const int N=120004; int n,m,par[20][N],d[N],vs[N*50],st[N]; bool check=0; vector<int> g[N],g1[N*50]; pair<int,int> pp[N]; void dfs(int u,int p=0) { for(auto v: g[u]) if (v!=p) { d[v]=d[u]+1; par[0][v]=u; g1[u].pb(v+n); g1[v].pb(v+n); if (st[u]) g1[v+n*18].pb(st[u]); if (st[v]) g1[v+n*18].pb(st[v]); For(i,1,16) { if (par[i-1][par[i-1][v]]==0) break; par[i][v]=par[i-1][par[i-1][v]]; g1[v+n*i].pb(v+n*(i+1)); g1[i*n+par[i-1][v]].pb(v+n*(i+1)); } For(i,1,16) { if (par[i-1][par[i-1][v]]==0) break; g1[v+n*(i+18)].pb(v+n*(i+17)); g1[v+n*(i+18)].pb(n*(i+17)+(par[i-1][v])); } dfs(v,u); } } int lca(int u,int v) { if (d[v]>d[u]) swap(u,v); int dd=d[u]-d[v]; For(i,0,16) if (dd>>i&1) u=par[i][u]; if (u==v) return u; ForD(i,16,0) if (par[i][u]!=par[i][v]) u=par[i][u],v=par[i][v]; return par[0][u]; } void add_path(int x,int u,int v,bool bodi=0) { if (d[v]>d[u]) swap(u,v); if (bodi && u==v) return; if (u==v || (par[0][u]==v && bodi)) { g1[u].pb(x); return; } int dd=d[u]-d[v]-bodi; For(i,0,16) if (dd>>i&1) { g1[u+n*(i+1)].pb(x); u=par[i][u]; } } void add_path1(int x,int u,int v,bool bodi=0) { if (d[v]>d[u]) swap(u,v); if (bodi && u==v) return; if (u==v || (par[0][u]==v && bodi)) { if (st[u]) g1[x].pb(st[u]); return; } int dd=d[u]-d[v]-bodi; For(i,0,16) if (dd>>i&1) { g1[x].pb(u+n*(i+18)); u=par[i][u]; } } void dfs1(int u) { vs[u]=1; for(auto v: g1[u]) if (vs[v]==0) { dfs1(v); } else if (vs[v]==1 && v!=u) { check=0; return; } vs[u]=2; } void solve() { cin >> n; fill(st,st+1+n,0); For(j,0,16) For(i,1,n) par[j][i]=0; For(i,1,n) For(j,0,33) vs[i+n*j]=0; For(i,1,n-1) { int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } cin >> m; For(i,1,m) { cin >> pp[i].ff >> pp[i].ss; st[pp[i].ss]=pp[i].ff; } dfs(1); For(i,1,m) { int s=pp[i].ff,t=pp[i].ss; if (s==t) continue; if (lca(s,t)==t) { add_path(s,par[0][s],t); add_path1(s,s,t,1); } else if (lca(s,t)==s) { add_path(s,t,s,1); add_path1(s,par[0][t],s); } else { add_path(s,par[0][s],lca(s,t)); add_path1(s,par[0][t],lca(s,t)); add_path(s,t,lca(s,t)); add_path1(s,s,lca(s,t)); } } check=1; For(i,1,n) For(j,0,33) if (!vs[i+n*j]) dfs1(i+n*j); if (check) cout << "Yes\n"; else cout << "No\n"; For(i,1,n) g[i].clear(); For(i,1,n) For(j,0,33) g1[i+n*j].clear(); } int main() { cin.tie(0)->sync_with_stdio(0); int t=1; 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...