제출 #1152502

#제출 시각아이디문제언어결과실행 시간메모리
1152502omtheprogrammer1Usmjeri (COCI17_usmjeri)C++20
140 / 140
395 ms132740 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
llo n,m;
llo mod=1e9+7;
vector<pair<llo,llo>> adj[300001];
vector<pair<llo,llo>> adj2[300001];
llo par[300001][20];
llo par2[300001];
llo st[300001];
llo endd[300001];
llo lev[300001];

llo co=0;
void dfs(llo no,llo par3=-1,llo levv=0,llo par4=-1){
	par[no][0]=par3;
	lev[no]=levv;
	par2[no]=par4;
	st[no]=co;
	co+=1;
	for(auto j:adj[no]){
		if(j.a==par3){
			continue;
		}
		dfs(j.a,no,levv+1,j.b);
	}
	endd[no]=co-1;
}
llo kk(llo no,llo dd){
	for(llo j=0;j<20;j++){
		if(((1<<j)&dd)){
			no=par[no][j];
		}
	}
	return no;
}
llo tree[310001];
void u(llo i,llo j){
	while(i<310001){
		tree[i]+=j;
		i+=(i&-i);
	}
}
llo ss(llo i){
	llo su=0;
	while(i>0){
		su+=tree[i];
		i-=(i&-i);
	}
	return su;
}
vector<llo> mm[300001];
pair<llo,pair<llo,llo>> lca(llo aa,llo bb){
	llo stt=0;
	
	if(lev[aa]>lev[bb]){
		stt=1;
		swap(aa,bb);
	}
	bb=kk(bb,lev[bb]-lev[aa]);
/*	if(aa==bb){
		while(true){
			continue;
		}
	}*/

	for(llo j=19;j>=0;j--){
		if(par[aa][j]!=par[bb][j]){
			aa=par[aa][j];
			bb=par[bb][j];
		}
	}
/*	if(aa==bb){
		while(true){
			continue;
		}
	}*/
	if(stt==0){
		return {par[aa][0],{aa,bb}};
	}
	else{
		return {par[aa][0],{bb,aa}};
	}
}
void dfs2(llo no,llo par3=-1){

	for(auto j:adj[no]){
		if(j.a!=par3){
			dfs2(j.a,no);
		}
	}
	for(auto j:mm[no]){
		u(j+1,-1);
	}
	for(auto j:adj[no]){
		if(j.a!=par3){
			if((ss(endd[j.a]+1)-ss(st[j.a]))>0){
				adj2[par2[no]].pb({j.b,0});
				adj2[j.b].pb({par2[no],0});
			}
		}
	}
}
llo vis[300001];
llo ok=1;
void dfs3(llo no,llo val=0){
	vis[no]=val+1;
	for(auto j:adj2[no]){
		if(vis[j.a]==0){
			dfs3(j.a,(vis[no]-1)^j.b);
		}
		else{
			if((vis[j.a]-1)!=((vis[no]-1)^j.b)){
				ok=0;
			}
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n>>m;
	for(llo i=0;i<n-1;i++){
		llo aa,bb;
		cin>>aa>>bb;
		aa--;
		bb--;
		adj[aa].pb({bb,i});
		adj[bb].pb({aa,i});
	}
	dfs(0);
/*	if(n>5000){
		return 0;
	}*/
	for(llo j=1;j<20;j++){
		for(llo 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(llo i=0;i<m;i++){
		llo aa,bb;
		cin>>aa>>bb;
		aa--;
		bb--;
		if(aa==bb){
			continue;
		}
		if(st[aa]>st[bb]){
			swap(aa,bb);
		}
		if(st[bb]>=st[aa] and st[bb]<=endd[aa]){
			mm[aa].pb(st[bb]);
			u(st[bb]+1,1);
		}
		else{
			pair<llo,pair<llo,llo>> xx=lca(aa,bb);
			mm[xx.a].pb(st[aa]);
			mm[xx.a].pb(st[bb]);
			adj2[par2[xx.b.a]].pb({par2[xx.b.b],1});
			adj2[par2[xx.b.b]].pb({par2[xx.b.a],1});
			u(st[aa]+1,1);
			u(st[bb]+1,1);
		
		}
	}

	dfs2(0);
	llo ans=1;
// 	for(llo i=0;i<n-1;i++){
// 		for(auto j:adj2[i]){
// 			adj2[j.a].pb({i,j.b});
// 		}
// 	}
	for(llo i=0;i<n-1;i++){
		/*for(auto j:adj2[i]){
				cout<<i<<":"<<j.a<<":"<<j.b<<endl;
			}*/
		if(vis[i]==0){
			dfs3(i);
			ans=(ans*2)%mod;
		}
	}
	if(ok==0){
		cout<<0<<endl;
	}
	else{
		cout<<ans<<endl;
	}
	//cout<<lca(5,6).a<<","<<lca(5,3).a<<","<<lca(7,1).a<<endl;
/*	for(int i=0;i<n;i++){
		for(int j=0;j<20;j++){
			cout<<par[i][j]<<",";
		}
		cout<<endl;
	}*/
	//cout<<lca(5,3).a<<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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...