0分求调,自己造的数据都过了?
查看原帖
0分求调,自己造的数据都过了?
1128359
Chmeon楼主2024/5/20 22:43
#include <bits/stdc++.h>    
using namespace std;
const int maxn=100010;
const int maxm=100010;
int head[maxn];
int ver[maxm];
int nex[maxm];
int tot;
int rot;
void add(int x,int y)
{
    tot++;
    nex[tot]=head[x];
    head[x]=tot;
    ver[tot]=y;
}
int n,m;
int d[maxn];
int fa[maxn][22];
void dfs(int x)
{
    for(int i=head[x];i;i=nex[i])
    {
        int y=ver[i];
        fa[y][0]=x;
        dfs(y);
    }
}

int check(int x)
{
    //找到第一个没有被标记的祖先
    int num=0;
    for(int k=21;k>=0;k--)
    {
        if(d[fa[x][k]]==1) continue;
        x=fa[x][k];
        num+=(int)pow(2,k);
    }
    return num;
}
int in[maxn];
int main()
{
    cin>>n>>m;
    d[0]=1;
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v);
        in[v]++;
    }
    for (int i = 1; i <= n; i++)
    {
        if (!in[i])
        {
            rot = i;
            break;
        }
    }
    dfs(rot);
    for(int k=1;k<=21;k++)
        for(int i=n;i>=1;i--)
            fa[i][k]=fa[fa[i][k-1]][k-1];
    getchar();
    for(int i=1;i<=m;i++)
    {
        string str;
        getline(cin,str);
        stringstream ss(str);
        char a;int b;
        ss>>a>>b;
        int num=check(b);
        cout<<num<<endl;
        if(a=='P'){
            d[b]=1;
            for(int i=1;i<=num;i++)
            {
                b=fa[b][0];
                d[b]=1;
            }
        }
    }
}

2024/5/20 22:43
加载中...