0pts求调
查看原帖
0pts求调
882193
Blue_Flower楼主2025/6/14 19:08

似乎应该是LCA没求好

#include<bits/stdc++.h>
#define N 100050
using namespace std;

inline int read()
{
    int x=0;
    char c=getchar();
    while(c>'9'||c<'0') c=getchar();
    while(c>='0'&&c<='9') 
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}

int n,q,dep[N],anc[N][19];
vector<int> G[N];

void dfs(int u,int f)
{
    dep[u]=dep[f]+1;
    anc[u][0]=f;
    for(int i=1;i<=19;i++)
            anc[u][i]=anc[anc[u][i-1]][i-1];
    for(int i=0;i<G[u].size();i++)
    {
        if(G[u][i]==f) continue;
        dfs(G[u][i],u);
    }
}

inline int LAC(int x,int y)
{
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=19;i>=0;i--)
        if(dep[anc[x][i]]>=dep[y]) x=anc[x][i];
    if(x==y) return x;
    for(int i=19;i>=0;i--)
        if(anc[x][i]!=anc[y][i])
            {x=anc[x][i];y=anc[y][i];}
    return anc[x][0];
}

int main()
{
    n=read();q=read();
    int u,v;
    for(int i=1;i<n;i++)
    {
        u=read();v=read();
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dfs(1,1);
    int a,b,c,d;
    while(q--)
    {
        a=read();b=read();c=read();d=read();
        int s1=LAC(a,b),s2=LAC(c,d);
        if(s1 < s2)
            {swap(s1,s2);swap(a,c);swap(b,d);}
    
        if((LAC(s1,c)==s1||LAC(s1,d)==s1))
            puts("Y");
        else puts("N");
    }
}
2025/6/14 19:08
加载中...