比赛 寒假集训2 评测结果 WWWWWWTTTTTTTTWTTTTT
题目名称 轻重边 最终得分 0
用户昵称 123 运行时间 15.177 s
代码语言 C++ 内存使用 11.96 MiB
提交时间 2026-02-25 11:00:06
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10,K=22;
int t,n,m,head[N],nxt[M],idx[M],fa[N],q[N],f[N][K],depth[N],tot=0;
void dfs(int now,int qfa)
{
    fa[now]=qfa,f[now][0]=qfa,depth[now]=depth[qfa]+1;
    for (int i=1;i<=20;i++) f[now][i]=f[f[now][i-1]][i-1];
    for (int i=head[now];i;i=nxt[i])
    {
        int y=idx[i];
        if (y==qfa) continue;
        dfs(y,now);
    }
}
int lca(int x,int y)
{
    if (depth[x]<depth[y]) swap(x,y);
    for (int i=20;i>=0;i--)
    {
        if (depth[f[x][i]]>=depth[y]) x=f[x][i];
    }
    if (x==y) return x;
    for (int i=20;i>=0;i--)
    {
        if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    }
    return f[x][0];
}
void add(int x,int y)
{
    idx[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
int main() {
    freopen("edge.in","r",stdin);
    freopen("edge.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>t;
    while (t--)
    {
        for (int i=1;i<=n;i++) head[i]=q[i]=0;
        tot=0;
        cin>>n>>m;
        for (int i=1;i<n;i++)
        {
            int x,y;
            cin>>x>>y;
            add(x,y),add(y,x); 
        }
        dfs(1,0);
        while (m--)
        {
            int op,x,y;
            cin>>op>>x>>y;
            if (op==1)
            {
                int k=lca(x,y),lst1=0,lst2=0;
                for (int i=x;i!=k;i=fa[i])
                {
                    q[i]=1;
                    for (int j=head[i];j;j=nxt[j])
                    {
                        int w=idx[j];
                        if (w==lst1 || fa[i]==w) continue;
                        q[w]=0;
                    }
                    lst1=i;
                }
                for (int i=y;i!=k;i=fa[i])
                {
                    q[i]=1;
                    for (int j=head[i];j;j=nxt[j])
                    {
                        int w=idx[j];
                        if (w==lst2 || fa[i]==w) continue;
                        q[w]=0;
                    }
                    lst2=i;
                }
                for (int j=head[k];j;j=nxt[j])
                {
                    int w=idx[j];
                    if (w==lst1 || w==lst2 || w==fa[k]) continue;
                    q[w]=0;
                }
            }
            else
            {
                int cnt=0,k=lca(x,y);
                for (int i=x;i!=k;i=fa[i]) cnt+=q[i];
                for (int i=y;i!=k;i=fa[i]) cnt+=q[i];
                cout<<cnt<<endl;
            }
        }
    }
}