제출 #674598

#제출 시각아이디문제언어결과실행 시간메모리
674598amirhoseinfar1385Jail (JOI22_jail)C++17
61 / 100
5054 ms37636 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=120000+5,maxl=19; vector<int>adj[maxn]; int lca[maxl][maxn]; int high[maxn]; pair<int,int>allm[maxn]; pair<int,int>stf[maxn]; int n,m,timea=0; set<int>adjdag[maxn]; void dfs(int u=1,int par=0){ lca[0][u]=par; high[u]=high[par]+1; timea++; stf[u].first=timea; for(auto x:adj[u]){ if(x!=par){ dfs(x,u); } } timea++; stf[u].second=timea; } void callca(){ for(int i=1;i<maxl;i++){ for(int j=0;j<=n;j++){ lca[i][j]=lca[i-1][lca[i-1][j]]; } } } int getlca(int u,int v){ if(u==v){ return u; } if(high[u]<high[v]){ swap(u,v); } for(int i=maxl-1;i>=0;i--){ if(lca[i][u]==0){ continue; } int pu=lca[i][u]; if(!(stf[pu].first<=stf[v].first&&stf[pu].second>=stf[v].second)){ u=pu; } } return lca[0][u]; } int dis(int u,int v){ int uv=getlca(u,v); // cout<<u<<" "<<v<<" >>- "<<uv<<endl; int ret=high[u]+high[v]; ret-=high[uv]*2; return ret; } bool calin(int u,int v1,int v2){ int uv1=dis(u,v1),uv2=dis(u,v2),v1v2=dis(v1,v2); if(uv1+uv2==v1v2){ // cout<<u<<" "<<v1<<" "<<v2<<endl; return 1; } else{ return 0; } } void calad(int u,int v){ int u1=allm[u].first,u2=allm[u].second,v1=allm[v].first,v2=allm[v].second; if(calin(v2,u1,u2)){ // cout<<u<<" 1 "<<v<<endl; adjdag[u].insert(v); } else if(calin(u1,v1,v2)){ // cout<<u<<" 2 "<<v<<endl; adjdag[u].insert(v); } if(calin(u2,v1,v2)){ // cout<<v<<" 3 "<<u<<endl; adjdag[v].insert(u); } else if(calin(v1,u1,u2)){ // cout<<v<<" 4 "<<u<<endl; adjdag[v].insert(u); } } int res; void caldag(){ vector<int>val(m); for(int i=0;i<m;i++){ for(auto x:adjdag[i]){ // cout<<i<<" "<<x<<endl; val[x]++; } } vector<int>now; for(int i=0;i<m;i++){ if(val[i]==0){ res++; now.push_back(i); } } while((int)now.size()>0){ int x=now.back(); now.pop_back(); for(auto y:adjdag[x]){ val[y]--; if(val[y]==0){ now.push_back(y); res++; } } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin>>t; for(int asd=0;asd<t;asd++){ timea=0; for(int i=0;i<=n;i++){ adj[i].clear(); for(int j=0;j<maxl;j++){ lca[j][i]=0; } high[i]=0; stf[i].first=stf[i].second=0; } for(int i=0;i<=m;i++){ adjdag[i].clear(); } cin>>n; for(int i=0;i<n-1;i++){ int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } dfs(); callca(); //cout<<dis(8,4)<<" "<<dis(3,4)<<" "<<dis(8,3)<<endl; cin>>m; for(int i=0;i<m;i++){ cin>>allm[i].first>>allm[i].second; } for(int i=0;i<m;i++){ for(int j=i+1;j<m;j++){ calad(i,j); } } res=0; caldag(); if(res==m){ cout<<"Yes\n"; } else{ cout<<"No\n"; } res=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...