zoukankan      html  css  js  c++  java
  • P4281 [AHOI2008]紧急集合 / 聚会

    P4281 [AHOI2008]紧急集合 / 聚会


    军训完。发现我自己连lca版都不会了

    然后就强行写了这个题

    然后卡了两天的原因就是计算距离写错了

    #include<cstdio> 
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    using std::swap;
    using std::abs;
    const int maxn=501000;
    struct node
    {
        int p;
        int nxt;
    };
    node line[maxn<<1];
    int head[maxn],tail;
    int st[maxn][30],Log[maxn];
    int dep[maxn];
    void add(int a,int b)
    {
        line[++tail].p=b;
        line[tail].nxt=head[a];
        head[a]=tail; 
    }
    void dfs(int now,int f)
    {
        st[now][0]=f;
        dep[now]=dep[f]+1;
        for(int i=1;i<=Log[dep[now]];i++)
            st[now][i]=st[st[now][i-1]][i-1];
        for(int i=head[now];i;i=line[i].nxt)
            if(line[i].p!=f)
                dfs(line[i].p,now);
    }
    int Lca(int a,int b)
    {
        if(dep[a]<dep[b])	swap(a,b);
        for(int i=Log[dep[a]];i>=0;i--)
            if(dep[st[a][i]]>=dep[b])
                a=st[a][i];
        if(a==b)	return a;
        for(int i=Log[dep[a]];i>=0;i--)
            if(st[a][i]!=st[b][i])
                a=st[a][i],b=st[b][i];
        return st[a][0];
    }
    int dist(int lca,int a,int b,int c)
    {
        return abs(dep[lca]-dep[a])+abs(dep[lca]-dep[b])+abs(dep[lca]-dep[c]);
    }
    void solve(int a,int b,int c)
    {
        int lca1=Lca(a,b),lca2=Lca(a,c),lca3=Lca(b,c);
        if(lca1==lca2)
            printf("%d ",lca3);
        else if(lca1==lca3)
            printf("%d ",lca2);
        else if(lca2==lca3)
            printf("%d ",lca1);
        printf("%d
    ",dep[a]+dep[b]+dep[c]-dep[lca1]-dep[lca2]-dep[lca3]);//就是这个鬼地方
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=2;i<=n;i++)	Log[i]=Log[i>>1]+1;
        int a,b,c;
        for(int i=1;i<n;i++) 
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
        dfs(1,0);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            solve(a,b,c);
        }
    }
    
  • 相关阅读:
    iOS:不同属性声明方式的解析
    iOS:图像和点击事件
    iOS:NAV+TABLE结合
    iOS:实现表格填充和选择操作
    iOS: 填充数据表格
    iOS:导航栏的工具条和导航条
    iOS:使用导航栏
    hello,world不使用ARC
    iOS代码实现:创建按钮,绑定按钮事件,读取控件值
    iOS版 hello,world版本2
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9579857.html
Copyright © 2011-2022 走看看