记录编号 322159 评测结果 AAAAAAAAA
题目名称 暗之链锁 最终得分 100
用户昵称 Gravatar求魔 是否通过 通过
代码语言 C++ 运行时间 0.585 s
提交时间 2016-10-14 19:19:22 内存使用 47.75 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define pa system("pause")
using namespace std;
const int maxn=1000010;
int n,m,head[maxn],len,cha[maxn],ans,cnt,a[maxn];
int size[maxn],id[maxn],pos[maxn],son[maxn],top[maxn],deep[maxn],fa[maxn]; 
void read(int &x)
{
	char ch;
	while(ch=getchar(),ch<'0'||ch>'9');
	x=ch-48;
	while(ch=getchar(),ch>='0'&&ch<='9')x=x*10+ch-48;
}
struct edge{
    int to,next;
}e[maxn<<1];
void insert(int x,int y)
{
    e[++len].to=y;e[len].next=head[x];head[x]=len;
}
void dfs1(int x)
{
	size[x]=1;son[x]=0;
	for(int i=head[x];i;i=e[i].next)
	{
		int k=e[i].to;
		if(!size[k])
		{
			deep[k]=deep[x]+1;fa[k]=x;
			dfs1(k);
			size[x]+=size[k];
			if(size[k]>size[son[x]])son[x]=k;
		}
	}
}
void dfs2(int x,int tp)
{
	id[x]=++cnt;pos[cnt]=x;top[x]=tp;
	if(son[x])dfs2(son[x],tp);
	for(int i=head[x];i;i=e[i].next)
	{
		int k=e[i].to;
		if(k!=fa[x]&&k!=son[x])dfs2(k,k);
	}
}
void add(int x,int y)
{
	int fx=top[x],fy=top[y];
	while(fx!=fy)
	{
		if(deep[fx]<deep[fy]){swap(x,y);swap(fx,fy);}
		 cha[id[fx]]++;cha[id[x]+1]--;
		 x=fa[fx];fx=top[x];
	}
	if(deep[x]>deep[y])swap(x,y);
	if(id[x]+1<=id[y])cha[id[x]+1]++,cha[id[y]+1]--;
}
int main()
{
	freopen("yam.in","r",stdin);
	freopen("yam.out","w",stdout);
    read(n);read(m);
    for(int i=1,x,y;i<n;++i)
    {
        read(x);read(y);
        insert(x,y);insert(y,x);
    }
    dfs1(1);dfs2(1,1);
    for(int i=1,x,y;i<=m;++i)
    {
       read(x);read(y);
        add(x,y);
    }
    for(int i=1;i<=n;++i)a[i]=cha[i]+a[i-1];
    for(int i=2;i<=n;++i)
    {
        if(a[i]==0)ans+=m;
        if(a[i]==1)ans++;
       // cout<<a[i]<<endl;
    }
    printf("%d\n",ans);
}