Submission #710852

#TimeUsernameProblemLanguageResultExecution timeMemory
710852Darren0724Jail (JOI22_jail)C++17
100 / 100
1318 ms287696 KiB
#include<bits/stdc++.h> using namespace std; const int N=120005; const int K=18; int n,m; vector<vector<int>> adj; vector<vector<int>> g; vector<vector<int>> jump(K,vector<int>(N)); vector<int> deep(N); vector<int> s1; vector<int> t1; void dfs(int k,int pa){ jump[0][k]=pa; for(int i=1;i<K;i++){ jump[i][k]=jump[i-1][jump[i-1][k]]; } for(int j:adj[k]){ if(j==pa){ continue; } deep[j]=deep[k]+1; dfs(j,k); } } int lca(int a,int b){ if(deep[a]<deep[b]){ swap(a,b); } int d=deep[a]-deep[b]; for(int i=0;i<K;i++){ if((1<<i)&d){ a=jump[i][a]; } } if(a==b){ return b; } for(int i=K-1;i>=0;i--){ if(jump[i][a]!=jump[i][b]){ a=jump[i][a]; b=jump[i][b]; } } return jump[0][a]; } int num1(int a,int b){ return m+b*n+a; } int num2(int a,int b){ return m+(b+K)*n+a; } void add1(int from,int to,int dis){ if(dis==-1){ return; } for(int i=0;i<K;i++){ if(dis&(1<<i)){ g[from].push_back(num1(to,i)); to=jump[i][to]; } } } void add2(int to,int from,int dis){ if(dis==-1){ return; } for(int i=0;i<K;i++){ if(dis&(1<<i)){ g[num2(from,i)].push_back(to); from=jump[i][from]; } } } void solve(){ adj.clear(); g.clear(); s1.resize(0); t1.resize(0); cin>>n; adj.resize(n); s1.resize(n,-1); t1.resize(n,-1); for(int i=1;i<n;i++){ int a,b;cin>>a>>b;a--;b--; adj[a].push_back(b); adj[b].push_back(a); } dfs(0,0); cin>>m; int N=num2(n-1,K-1)+1; g.resize(N); vector<int> s(m),t(m); for(int i=0;i<m;i++){ cin>>s[i]>>t[i];s[i]--;t[i]--; s1[s[i]]=i; t1[t[i]]=i; } for(int i=0;i<m;i++){ int l=lca(s[i],t[i]); add1(i,jump[0][s[i]],deep[s[i]]-deep[l]); add1(i,t[i],deep[t[i]]-deep[l]); } for(int i=0;i<m;i++){ int l=lca(s[i],t[i]); add2(i,s[i],deep[s[i]]-deep[l]); add2(i,jump[0][t[i]],deep[t[i]]-deep[l]); } for(int j=K-1;j>0;j--){ for(int i=0;i<n;i++){ g[num1(i,j)].push_back(num1(i,j-1)); g[num1(i,j)].push_back(num1(jump[j-1][i],j-1)); } } for(int j=K-1;j>0;j--){ for(int i=0;i<n;i++){ g[num2(i,j-1)].push_back(num2(i,j)); g[num2(jump[j-1][i],j-1)].push_back(num2(i,j)); } } for(int i=0;i<n;i++){ if(s1[i]!=-1){ g[num1(i,0)].push_back(s1[i]); } if(t1[i]!=-1){ g[t1[i]].push_back(num2(i,0)); } } vector<int> in(N); for(int i=0;i<N;i++){ for(int j:g[i]){ in[j]++; } } queue<int> q; for(int i=0;i<N;i++){ if(in[i]==0){ q.push(i); } } int cnt=0; while(q.size()){ int p=q.front(); q.pop(); cnt++; for(int j:g[p]){ in[j]--; if(in[j]==0){ q.push(j); } } } if(cnt==N){ cout<<"Yes"<<'\n'; } else{ cout<<"No"<<'\n'; } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int t;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...