记录编号 352707 评测结果 AAAAAAAAA
题目名称 暗之链锁 最终得分 100
用户昵称 GravatarMetatron 是否通过 通过
代码语言 C++ 运行时间 1.160 s
提交时间 2016-11-17 15:46:33 内存使用 10.59 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 100005
#define maxm 100005
struct Edge{
	int to,next;
}a[maxm<<1];
int n,m,l,len,head[maxn],de[maxn],dp[maxn],f[maxn][20];
/*void swap(int& x,int& y){
	int& t=x;x=y;y=t;
}*/
void Insert(int x,int y){
	a[++len].next=head[x];a[len].to=y;head[x]=len;
}
void dfs(int x){
	for(int i=head[x];i!=-1;i=a[i].next){
		int k=a[i].to;
		if(f[x][0]==k)	continue;
		de[k]=de[x]+1;
		f[k][0]=x;
		dfs(k);
	}
}
int LCA(int x,int y){
	if(de[x]<de[y])	swap(x,y);
	for(int j=l-1;j>=0;--j)
		if(de[f[x][j]]>=de[y])
			x=f[x][j];
	if(x==y)	return x;
	for(int j=l-1;j>=0;--j)
		if(f[x][j]!=f[y][j])
			x=f[x][j],y=f[y][j];
	return f[x][0];
}
void DP(int x,int rt){
	for(int i=head[x];i!=-1;i=a[i].next){
		int k=a[i].to;
		if(k==rt)	continue;
		DP(k,x);
		dp[x]+=dp[k];
	}
}	
int main(){
	freopen("yam.in","r",stdin);freopen("yam.out","w",stdout);
	scanf("%d%d",&n,&m);
	memset(head,-1,sizeof head);
	for(int i=1;i<n;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		Insert(x,y);
		Insert(y,x);
	}
	dfs(1);f[1][0]=1;
	l=(int)(log(n*1.0)/log(2.0))+1;
	for(int j=1;j<l;++j)
		for(int i=1;i<=n;++i)
			f[i][j]=f[f[i][j-1]][j-1];
	for(int i=1;i<=m;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		dp[x]++;dp[y]++;
		dp[LCA(x,y)]-=2;
	}
	DP(1,0);
	int ans=0;
	for(int i=2;i<=n;++i)
		if(dp[i]==1)	ans++;
		else if(!dp[i])	ans+=m;
	printf("%d\n",ans);
	return 0;
}