제출 #551831

#제출 시각아이디문제언어결과실행 시간메모리
551831kshitij_sodaniJail (JOI22_jail)C++14
72 / 100
5078 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; typedef long long llo; #define a first #define b second #define pb push_back #define endl '\n' const llo mod=1e9+7; int q; int ee; vector<int> adj[200001]; int cc[200001]; int dd[200001]; int vis[200001]; vector<int> ss; vector<int> tt; vector<int> pre[200001]; map<int,int> ind[200001]; int ind2[200001]; int ind3[200001]; vector<int> adj2[200001]; int vis2[200001]; int vis3[200001]; void dfs(int no,int par2=-1){ ss.pb(no); if(ee==no){ tt=ss; } for(auto j:adj[no]){ if(j!=par2){ dfs(j,no); } } ss.pop_back(); } int stt=1; void dfs2(int no){ vis2[no]=1; vis3[no]=1; for(auto j:adj2[no]){ if(vis3[j]==1){ stt=0; } if(vis2[j]==0){ dfs2(j); } } vis3[no]=0; } int par[120001][20]; int up[120001]; int lev[120001]; void dfs3(int no,int par2=-1,int xx=-1,int levv=0){ par[no][0]=par2; up[no]=xx; lev[no]=levv; if(ind2[no]>=0 or ind3[no]>=0){ xx=no; } for(auto j:adj[no]){ if(j!=par2){ dfs3(j,no,xx,levv+1); } } } int lca(int aa,int bb){ if(lev[bb]<lev[aa]){ swap(aa,bb); } //cout<<lev[bb]<<",,"<<lev[aa]<<endl; int dif=lev[bb]-lev[aa]; //cout<<dif<<",,"<<endl; for(int j=19;j>=0;j--){ if((1<<j)&dif){ bb=par[bb][j]; } } /* cout<<bb<<",,"<<par[bb][0]<<endl; cout<<dif<<",,"<<endl; cout<<aa<<",,"<<bb<<endl;*/ if(aa==bb){ return aa; } for(int j=19;j>=0;j--){ if(par[aa][j]!=par[bb][j]){ aa=par[aa][j]; bb=par[bb][j]; } } return par[aa][0]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>q; while(q--){ int n; cin>>n; for(int i=0;i<n;i++){ adj[i].clear(); adj2[i].clear(); } for(int i=0;i<n-1;i++){ int aa,bb; cin>>aa>>bb; aa--; bb--; adj[aa].pb(bb); adj[bb].pb(aa); } int m; cin>>m; stt=1; for(int i=0;i<n;i++){ ind2[i]=-1; ind3[i]=-1; } for(int i=0;i<m;i++){ cin>>cc[i]>>dd[i]; ind[i].clear(); cc[i]--; dd[i]--; ind2[dd[i]]=i; ind3[cc[i]]=i; ee=dd[i]; /* dfs(cc[i]); pre[i]=tt; for(auto j:tt){ ind[i][j]++; }*/ } dfs3(0); for(int j=1;j<20;j++){ for(int i=0;i<n;i++){ if(par[i][j-1]==-1){ par[i][j]=-1; } else{ par[i][j]=par[par[i][j-1]][j-1]; } } } for(int i=0;i<m;i++){ int x=lca(cc[i],dd[i]); /// cout<<cc[i]<<":"<<dd[i]<<":"<<x<<endl; int j=cc[i]; while(j!=-1){ if(lev[j]<lev[x]){ break; } if(ind3[j]>=0 and ind3[j]!=i){ adj2[i].pb(ind3[j]); //cout<<i<<":"<<ind3[j]<<endl; } if(ind2[j]>=0 and ind2[j]!=i){ adj2[ind2[j]].pb(i); //cout<<ind2[j]<<":"<<i<<endl; } j=up[j]; } j=dd[i]; while(j!=-1){ if(lev[j]<lev[x]){ break; } if(ind3[j]>=0 and ind3[j]!=i){ adj2[i].pb(ind3[j]); //cout<<i<<":"<<ind3[j]<<endl; } if(ind2[j]>=0 and ind2[j]!=i){ adj2[ind2[j]].pb(i); //cout<<ind2[j]<<":"<<i<<endl; } j=up[j]; } //cout<<endl; /* for(auto j:pre[i]){ if(ind3[j]>=0 and ind3[j]!=i){ adj2[i].pb(ind3[j]); //cout<<i<<":"<<ind3[j]<<endl; } if(ind2[j]>=0 and ind2[j]!=i){ adj2[ind2[j]].pb(i); // cout<<ind2[j]<<":"<<i<<endl; } }*/ } for(int i=0;i<m;i++){ vis2[i]=0; } for(int i=0;i<m;i++){ if(vis2[i]==0){ dfs2(i); } } if(stt==0){ cout<<"No"<<endl; } else{ cout<<"Yes"<<endl; } /* string ans="No"; vector<int> ss; for(int i=0;i<m;i++){ ss.pb(i); } while(true){ for(int j=0;j<n;j++){ vis[j]=0; } for(int j=0;j<m;j++){ vis[cc[j]]=1; } int ok=0; for(auto j:ss){ vis[cc[j]]=0; for(auto i:pre[j]){ if(vis[i]==1){ ok++; } } vis[dd[j]]=1; } if(ok==0){ ans="Yes"; } if(next_permutation(ss.begin(),ss.end())){ } else{ break; } } cout<<ans<<endl;*/ /*for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ int co=0; if(i==j){ continue; } if(ind[j].find(cc[i])!=ind[j].end()){ if(ind[j].find(dd[i])!=ind[j].end()){ ans="No"; } } for(auto jj:pre[j]){ if(ind[i].find(dd[j])) } if(ind[j].find(dd[i])!=ind[j].end()){ if(ind[i].find(pre[j].back())!=ind[i].end()){ ans="No"; break; } } } }*/ // cout<<ans<<endl; } 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...