比赛 4043级2023省选练习赛3 评测结果 WTTTTTTTTT
题目名称 树点涂色 最终得分 0
用户昵称 Skloud 运行时间 9.022 s
代码语言 C++ 内存使用 8.43 MiB
提交时间 2023-03-08 20:06:06
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
int n,m,a,b,t,f;
int head[100010],ne[100010],v[100010],w[100010],pre[100010],tot,color;
int va[100010],hei[100010];
void add(int x,int y)
{
	v[++tot]=y;
	ne[tot]=head[x];
	head[x]=tot;
	pre[y]=x;
} 
void init()
{
	queue <int> q;
	map <int,int> ma;
	q.push(1);
	for(int i=1;i<=n;i++) va[i]=1;
	ma[1]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int p=head[u];p;p=ne[p])
		{
			if(ma[w[v[p]]]==0) ma[w[v[p]]]=1,va[v[p]]=va[u]+1;
			q.push(v[p]);
		}
	}
}
void paint(int x)
{
	queue <int> q;
	q.push(x);
	w[x]=w[1]=++color;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		if(u==0) break;
		w[pre[u]]=color;
		q.push(pre[u]);
	}
}
int earch(int x)
{
	queue<int>q;
	q.push(x);
	int ans=-1;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int p=head[u];p;p=ne[p])
		{
			ans=max(ans,va[v[p]]);
			q.push(v[p]);
		}
	}
	return ans;
}
int lca(int x,int y)
{
	if(hei[x]<hei[y]){int z=x;x=y,y=z;}
	while(hei[x]>hei[y]) x=pre[x];
	while(x!=y) x=pre[x],y=pre[y];
	return x;
}
int main()
{
	freopen("sdoi2017paint.in","r",stdin);
	freopen("sdoi2017paint.out","w",stdout);
	scanf("%d%d",&n,&m);
	hei[1]=1;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		add(a,b);
		w[++color]=color;
		va[i]=1;
		hei[b]=hei[a]+1;
	}
	w[++color]=color,va[n]=1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&t);
		if(t==1)
		{
			scanf("%d",&a);
			paint(a);
			f=0;
		}
		else if(t==2)
		{
			scanf("%d%d",&a,&b);
			if(f==0){init();f=1;}
			int u=lca(a,b);
			printf("%d\n",va[b]-va[u]+va[a]-va[u]+1);
		}
		else if(t==3)
		{
			scanf("%d",&a);
			if(f==0){init();f=1;}
			printf("%d\n",earch(a));
		}
	}
	return 0;
}