Submission #674598

#TimeUsernameProblemLanguageResultExecution timeMemory
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...