比赛 |
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;
}