ZJ d767: 血緣關係

LCA算法裸題
以下為code
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using ll = long long;
#define AC ios::sync_with_stdio(0),cin.tie(0);

vector<vector<int>> v,dou;
vector<pair<intint>> ti;
vector<int> dep;
int L,cou=1;

void dfs(int x,int par)
{
    ti[x].first = cou++;
    dou[x][0]=par;
    for(int i=1;i<=L;i++) dou[x][i]=dou[dou[x][i-1]][i-1];
    for(auto e:v[x]) dep[e]=dep[x]+1,dfs(e,x);
    ti[x].second = cou++;
}

bool anc(int x,int y)
{
    return ti[x].first<=ti[y].first&&ti[x].second>=ti[y].second;
}

int LCA(int x,int y)
{
    if(anc(x,y)) return x;
    for(int i=L;i>=0;i--)
        if(!anc(dou[x][i],y)) x=dou[x][i];
    return dou[x][0];
}

int main()
{
    AC
    int n,q,t;
    cin >> n >> q;
    L=log2(n)+1;
    v.resize(n+1),ti.resize(n+1),dou.resize(n+1,vector<int>(L+1)),dep.resize(n+1);
    for(int i=1;i<=n;i++)
        while(cin>>t&&t) v[i].emplace_back(t);
    dfs(1,1);
    while(q--)
    {
        int x,y;
        cin >> x >> y;
        int t=LCA(x,y);
        cout<<t<<' '<<dep[x]-dep[t]+dep[y]-dep[t]<<'\n';
    }
}

留言

這個網誌中的熱門文章

TIOJ 1080 . A.逆序數對 (BIT解法)

ZJ d718: Waiting In Line

AtCoder Educational DP Contest E - Knapsack 2