首页 > 其他分享 >倍增求lca

倍增求lca

时间:2023-09-09 17:11:53浏览次数:40  
标签:lg head int tot fa depth lca 倍增

步骤:

1.前置准备:lg数组,depth数组,fa数组

2.若x与y不在同一深度,先让它们跳到同一深度

3.开始倍增往上跳

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const long long N=1e6+10;
int n,m,s,h1,h2,lg[N],fa[500010][30],depth[N];
int tot=0,head[N],nxt[N],v[N];
void add(int x,int y){
    tot++;
    v[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs(int now,int fath){
    fa[now][0]=fath;
    depth[now]=depth[fath]+1;
    for(int i=1;i<=lg[depth[now]];i++){
        fa[now][i]=fa[fa[now][i-1]][i-1];
    }
    for(int i=head[now];i;i=nxt[i]){
        if(v[i]!=fath) dfs(v[i],now);
    }
}
int lca(int x,int y){
    if(depth[x]<depth[y]) swap(x,y);
    while(depth[x]>depth[y]){
        x=fa[x][lg[depth[x]-depth[y]]-1];
    }
    if(x==y) return x;
    for(int i=lg[depth[x]]-1;i>=0;i--){
        if(fa[x][i]!=fa[y][i]){
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return fa[x][0];
}
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++){
        lg[i]=lg[i-1]+(1<<lg[i-1]==i);
    }
    for(int i=1;i<n;i++){
        scanf("%d%d",&h1,&h2);
        add(h1,h2);
        add(h2,h1);
    }
    dfs(s,0);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&h1,&h2);
        printf("%d\n",lca(h1,h2));
    }
    return 0;
}

 

标签:lg,head,int,tot,fa,depth,lca,倍增
From: https://www.cnblogs.com/dgdger/p/17689771.html

相关文章

  • IU86751低空载电流,40倍增益免滤波,2X28W双声道或50W音频放大器
    IU86751E是一款2x28W立体声;在单声道使用的情况下;最高可输出50W高效D类音频功率放大电路。先进的EMI抑制技术使得在输出端口采用廉价的铁氧体磁珠滤波器就可以满足EMC要求。IU86751E音频功率放大器是为需要输出高质量音频功率的系统设计的,它采用表面贴装技术,只需少量的外围器件,便使......
  • 第 360 场周赛 (二进制枚举、树上倍增)
    2833. 距离原点最远的点 本题要求最远的距离,所有‘_’必须全为左或全为右。利用前缀和的思想看看L多还是R多,最后加上_的数目就是答案。classSolution{public:intfurthestDistanceFromOrigin(stringmoves){intn=moves.size();inttt=0,l......
  • VirtualCamera虚拟相机实时拍照教程
    VirtualCamera虚拟相机实时拍照教程简介说明:虚拟相机实时拍照可以替换一些app需要实时拍照,但不能选择本地相册图片的应用,当使用该应用的时候,可以做到将相册中的照片替换成实时拍照的照片,以做到某些条件下无法实时拍照的要求。一、适用机型及系统1、机型:iphone6、6s、6p、7、7p、......
  • VirtualCamera虚拟相机实时视频使用教程
    VirtualCamera虚拟相机实时视频使用教程简介说明VirtualCamera虚拟相机实时视频主要用于直播平台带货直播,无人直播,视频通话等场景,视频时长不限,大小不限,高清实时替换,可动态调节快慢。注意,使用过程中视频声音是无法发送过去的,声音来着外部接收,就如我们视频通话时一样,声音来自外部。......
  • Codeforces Round 885 (Div. 2) F. Vika and Wiki(数学,倍增)
    题目链接:https://codeforces.com/problemset/problem/1848/F 大致题意:长度为n(n是2的幂次),每轮让a【i】=a【i】^a【i%n+1】,(^为异或)问需要操作多少次后可以使得每个数为0; 解题思路:我们来观察:第一次相当于:a【i】=a【i】^a【i+1】,a【i+1】=a【i+1】^a【i+2】第二次......
  • 云原生批量计算引擎 Volcano社区v1.8.0版本正式发布
    本文分享自华为云社区《云原生批量计算引擎Volcano社区v1.8.0版本正式发布》,作者:云容器大未来。北京时间2023年8月17日,Volcano社区v1.8.0版本正式发布,此次版本增加了以下新特性:支持vGPU调度及隔离支持vGPU和用户自定义资源的抢占能力新增JobFlow工作流编排引擎......
  • 【学习笔记】优化建图相关(线段树优化,倍增优化)
    优化建图发现并没有人写得很详细的样子,那我也摆烂好惹点击查看目录目录前言线段树优化建图单点连区间区间连区间例题解题:倍增优化建图例题解题:前言众所周知,连边的时间复杂度一般是\(O(1)\),但,当连边的对象是一个连续的树上区间的时候,我们或许有更优的连边方式:优化建图。......
  • B. 攻防演练 (倍增)
    攻防演练来源2021年中国大学生程序设计竞赛女生专场https://codeforces.com/gym/103389/problem/B题解注意倍增的递推顺序还有\(0,n+1\)的情况!!!#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5,K=20,M=30;intm,n,q,l,r;strings;int......
  • Unity VirtualCamera的使用
    我今天才明白了解VirtualCamera的强大,他几乎可以满足你对相机的所有需求,包括跟随物体,移动视角等等;1.首先我想介绍的是第一个Priority(优先事项),记住它是取决于你相机哪个先看哪个后看的因素,大号在前,小号在后的排序逻辑;2.Follow和LookAt一个是跟随物体,一个是一直保持看他,如果......
  • 【算法学习笔记】DFN序求LCA(最近公共祖先)
    前置知识DFN序:对一棵树进行深度优先搜索DFS得到的结点序列,即深度优先搜索DFS的访问顺序。该表述不一定严谨,建议百度ST表(SparseTable,稀疏表)算法概述引理1.1在DFN序中祖先一定出现后代之前。考虑一树上的两个节点\(x\),\(y\)的最近公共祖先\(d\),设\(x\)的DFN序......