求添加hack数据
查看原帖
求添加hack数据
638153
KingkongLi楼主2025/7/26 17:32
#include<bits/stdc++.h>
using namespace std;
int n,q,d[500005],f[500005][20],sz[500005],tmp;
vector<int> e[500005];
void dfs(int u,int fa){d[u]=d[fa]+1,f[u][0]=fa;for(int x:e[u])if(x!=fa)dfs(x,u),sz[u]+=sz[x];}
int main(){
    cin>>n>>q,sz[n]=1,tmp=n;
    for(int i=1,u,v;i<n;i++)cin>>u>>v,e[u].push_back(v),e[v].push_back(u),sz[i]=1;
    dfs(1,0);
    for(int i=1;i<19;i++)for(int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1];
    while(q--){
        int u,v,w,x,y,lca;
        cin>>u>>v>>w,x=u,y=v;
        if(x==y&&y==w){cout<<n<<"\n";continue;}
        if(d[x]<d[y])swap(x,y);
        for(int i=18;i>=0;i--)
            if(d[x]-d[y]>>i&1)
                lca=x=f[x][i];
        if(x!=y){
            for(int i=18;i>=0;i--)
                if(f[x][i]!=f[y][i])
                    x=f[x][i],y=f[y][i];
            lca=f[x][0];
        }
        if((d[w]>d[u]&&d[w]>d[v])||d[w]<d[lca]){cout<<"0\n";continue;}
        x=u,y=v;
        for(int i=18;i>=0;i--)
            if(d[x]-d[w]>>i&1)
                x=f[x][i];
        for(int i=18;i>=0;i--)
            if(d[y]-d[w]>>i&1)
                y=f[y][i];
        if(x!=w&&y!=w)cout<<"0\n";
        else if(w==lca){
            y=u;
            for(int i=18;i>=0;i--)
                if(d[y]-d[w]-1>>i&1)
                    y=f[y][i];
            n-=sz[y],x=v,y=w;
            for(int i=18;i>=0;i--)
                if(d[x]-d[w]-1>>i&1)
                    x=f[x][i];
            cout<<n-sz[x]<<"\n",n=tmp;
        }else if(x==w){
            y=u;
            for(int i=18;i>=0;i--)
                if(d[y]-d[w]-1>>i&1)
                    y=f[y][i];
            cout<<sz[w]-sz[y]<<"\n";
        }else{
            x=v;
            for(int i=18;i>=0;i--)
                if(d[x]-d[w]-1>>i&1)
                    x=f[x][i];
            cout<<sz[w]-sz[x]<<"\n";
        }
    }
}

这份代码如果注释14行通过不了样例三的第3个询问,但能AC这道题

2025/7/26 17:32
加载中...