蒟蒻求调
查看原帖
蒟蒻求调
280604
DiDi123楼主2022/5/3 22:13
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100001
struct edge 
{
	int to,nex;
}Edge[MAXN<<1];
int head[MAXN],cnt;
void add(int u,int v)
{
	Edge[cnt].nex=head[u];
	Edge[cnt].to=v;
	head[u]=cnt++;
}
int n,k,lg[MAXN],d[MAXN],a[MAXN];
int fa[MAXN][21],depth[MAXN];
void dfs(int now,int fath)
{
	fa[now][0]=fath,depth[now]=depth[fath]+1;
	for(int i=1;i<=lg[depth[now]];i++)
		fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];i!=-1;i=Edge[i].nex)
		if(Edge[i].to!=fath)
			dfs(Edge[i].to,now);
}
int lca(int x,int y)
{
	if(depth[x]<depth[y]) swap(x,y);
	while(depth[x]>depth[y])
		x=fa[x][lg[depth[x]-depth[y]]];
	if(x==y) return y;
	for(int i=lg[depth[x]];i>=0;i--)
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
void dd(int now,int fath)
{
	for(int i=head[now];i!=-1;i=Edge[i].nex)
		if(Edge[i].to!=fath)
		{
			dd(Edge[i].to,now);
			d[now]+=d[Edge[i].to];
		}
}
int x[MAXN],y[MAXN];
int main()
{
	memset(head,-1,sizeof(head));
	cin>>n>>k;
	for(int i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	int a1,a2;
	for(int i=1;i<=n-1;i++)
	{
		cin>>x[i]>>y[i];
		add(x[i],y[i]);
		add(y[i],x[i]);
	}
	dfs(1,0);
	for(int i=1;i<=k;i++)
	{
		cin>>a1>>a2;
		d[lca(a1,a2)]-=2;
		d[a1]++,d[a2]++;
	}
	dd(1,0);
	for(int i=1;i<=n-1;i++)
		cout<<(depth[x[i]] > depth[y[i]] ? d[x[i]] : d[y[i]])<<' ';
}
2022/5/3 22:13
加载中...