zoukankan      html  css  js  c++  java
  • Codeforces 832D

    832D - Misha, Grisha and Underground

    思路:lca,求两个最短路的公共长度。公共长度公式为(d(a,b)+d(b,c)-d(a,c))/2。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define ls rt<<1,l,m
    #define rs rt<<1|1,m+1,r
    const int INF=0x3f3f3f3f;
    const int N=1e5+5;
    const int logn=20;
    vector<int>g[N];
    int anc[logn][N];
    int deep[N];
    void dfs(int o,int u)
    {
        deep[u]=deep[o]+1;
        for(int j=0;j<g[u].size();j++)
        {
            if(g[u][j]!=o)
            {
                anc[0][g[u][j]]=u;
                for(int i=1;i<logn;i++)anc[i][g[u][j]]=anc[i-1][anc[i-1][g[u][j]]];
                dfs(u,g[u][j]);
            }
        }
    }
    int lca(int u,int v)
    {
        if(deep[u]<deep[v])swap(u,v);
        for(int i=logn-1;i>=0;i--)if(deep[anc[i][u]]>=deep[v])u=anc[i][u];
        if(u==v)return u;
        for(int i=logn-1;i>=0;i--)if(anc[i][u]!=anc[i][v])u=anc[i][u],v=anc[i][v];
        return anc[0][u];
    }
    int dis(int u,int v)
    {
        int l=lca(u,v);
        return deep[u]+deep[v]-2*deep[l];
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,q;
        cin>>n>>q;
        for(int i=2;i<=n;i++)
        {
            int a;
            cin>>a;
            g[a].push_back(i);
            g[i].push_back(a);
        } 
        for(int i=0;i<logn;i++)anc[i][1]=1;
        dfs(0,1);
        while(q--)
        {
            int a,b,c;
            cin>>a>>b>>c;
            int d1=(dis(a,b)+dis(b,c)-dis(a,c))/2+1;
            int d2=(dis(a,c)+dis(b,c)-dis(a,b))/2+1;
            int d3=(dis(a,b)+dis(a,c)-dis(b,c))/2+1;
            int ans=max(d1,max(d2,d3));
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    21 情态动词
    20 动词的用法
    19 完成时/现在完成时和过去完成时的区别
    18 将来时
    17 一般过去时和过去进行时
    16 一般现在时和现在进行时
    15 There / Here be句型
    14 不定量表达法
    13 副词
    12 形容词
  • 原文地址:https://www.cnblogs.com/widsom/p/7258296.html
Copyright © 2011-2022 走看看