社区讨论

萌新0分,求dalao康康...

P3398仓鼠找 sugar参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi6yjy9z
此快照首次捕获于
2025/11/20 12:55
4 个月前
此快照最后确认于
2025/11/20 12:55
4 个月前
查看原帖
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int MAXN=1e6+1;
vector<int>G[MAXN];
int fa[MAXN][22],depth[MAXN],ou[MAXN];
bool vist[MAXN];
int root,n,m;
void dfs(int u,int v)
{
    vist[v]=true;
    depth[v]=depth[u]+1;
    fa[v][0]=u;
    for(int i=0;i<20;i++)
        fa[v][i]=fa[fa[v][i-1]][i-1];
    for(unsigned int i=0;i<G[v].size();i++)
    {
        int v0=G[v][i];
        if(!vist[v0])
            dfs(v,v0);
    }
}
int lca(int x,int y)
{
    if(depth[x]<depth[y])
        swap(x,y);
    for(int i=19;i>=0;i--)
        if(depth[x]-(1<<i)>=depth[y])
            x=fa[x][i];
    if(x==y)
        return x;
    for(int i=19;i>=0;i--)
    {
        if(fa[x][i]!=fa[y][i])
        {
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return fa[x][0];
}
int main()
{
    //freopen("text.in","r",stdin);
    //freopen("text.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    memset(vist,false,sizeof(vist));
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d %d\n",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
        ou[x]=1;
    }
    for(int i=1;i<=n;i++)
    {
        if(ou[i]==0)
        {
            root=i;
            break;
        }
    }
    dfs(0,root);
    for(int i=1;i<=m;i++)
    {
        int a,b,c,d,k,t;
        scanf("%d %d %d %d\n",&a,&b,&c,&d);
        k=lca(a,b);
        t=lca(c,d);
        if(depth[k]>depth[c]&&depth[k]>depth[d])
        {
            printf("N\n");
            continue;
        }
        if(depth[t]>depth[a]&&depth[t]>depth[b])
        {
            printf("N\n");
            continue;
        }
        if(depth[k]>=depth[t])
        {
            if(lca(k,c)==k||lca(k,d)==k)
            {
                printf("Y\n");
                continue;
            }
        }
        else
        {
            if(lca(t,a)==t||lca(t,b)==t)
            {
                printf("Y\n");
                continue;
            }
        }
        printf("N\n");
    }
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...