首页 > 其他分享 >LCA[模板]

LCA[模板]

时间:2024-05-20 22:41:17浏览次数:14  
标签:ei int mid long MAXN LCA climb 模板


#include <bits/stdc++.h>
#define int long long
#define MAXN 500010
using namespace std;
struct edge
{
    int nxt,to;
};
edge e[MAXN*2];
int h[MAXN],ei;
void add(int x,int y){
    ei++;
    e[ei].to = y;
    e[ei].nxt = h[x];
    h[x] = ei;
}
int u[MAXN], f[MAXN][20],dep[MAXN],lg[MAXN],n,m,s;
void dfs(int s)
{
    u[s] =1;
    //建立倍增
    for(int i=1;i<=19;i++){
        int t1 = f[s][i-1]; //2^i  2
        if(t1==0) break;
        int t2 = f[t1][i-1];
        if(t2==0) break; 
        f[s][i] = t2;
    }
    for(int i=h[s];i;i=e[i].nxt){
        int to = e[i].to;
        if(u[to]==1) continue;
        dep[to] =dep[s]+1;
        f[to][0] = s; //to 爬2^0是 s 
        dfs(to);
    }
}
int climb(int x,int l){
    while(l!=0){
        int p  = lg[l];
        x = f[x][p];
        l = l - (1<<p); 
    }
    return x;
}
void buildlg2(){
    lg[1] = 0;
    for(int i=2;i<=n;i++) lg[i] = lg[i/2]+1;
}
int lca(int x,int y){
    if(dep[x]<dep[y]){
        swap(x,y);
    }//
    x = climb(x,dep[x]-dep[y]);
    if(x==y) return x;
    int l = 1,r = dep[x];//白和 
    while(l<r)
    {
        int mid=(l+r)>>1;
        int fx = climb(x,mid);
        int fy = climb(y,mid);
        if(fx==fy){
            r = mid;
        }else{
            l = mid+1;
        }
    } 
    return climb(x,r);
}
signed main()
{
    cin>>n>>m>>s;
    buildlg2();
    for(int i=1;i<n;i++){
        int x,y;
        scanf("%lld%lld",&x,&y);
        add(x,y);
        add(y,x);
    }
    dep[s] =1;
    dfs(s);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%lld%lld",&x,&y); 
        printf("%lld\n",lca(x,y));
    }
    return 0;
}

标签:ei,int,mid,long,MAXN,LCA,climb,模板
From: https://www.cnblogs.com/wenzhihao2023/p/18202955

相关文章

  • C++常用模板
    常用模板:1.组合数(注意\(N\)与\(mod\))点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstllN=1e3+10,mod=998244353;lln,a[N],jc[N],dp[N],ans;voidinit(){ jc[0]=1; for(inti=1;i<N;i++)jc[i]=jc[i-1]*i%mod;}llksm......
  • C123【模板】扩展域并查集 P1892 [BOI2003] 团伙
    视频链接:C123【模板】扩展域并查集P1892[BOI2003]团伙_哔哩哔哩_bilibili  P1892[BOI2003]团伙-洛谷|计算机科学教育新生态(luogu.com.cn)//扩展域并查集#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,a,b,......
  • 信息安全事件应急处理报告模板
    目录一、概述1.1应急处理服务背景1.2应急处理服务目的1.3应急处理服务范围1.4应急处理服务依据1.4.1应用处理服务委托协议1.4.2基础标准与法律文件1.4.3参考文件二、应急处理服务流程三、应急处理服务内容和方法3.1准备阶段3.1.1准备阶段工作流程3.1.2准备阶段处理过程3......
  • ide创建maven项目时,选择哪个模板
    创建新的java项目时,选择maven框架比较节省时间,因为部分文件和目录都会给你建好,免得自己再费力创建。  我们常用的三个框架为:1、cocoon-22-archetype-webapp 【如果创建带有页面的项目,可以选择这个】目录结构: 2、maven-archetype-quickstart  【......
  • mybatis底层模板模型是什么
    mybatis底层模板模型是建造者模式和模板方法模式的结合。建造者模式用于创建SqlSessionFactory和SqlSession对象。模板方法模式用于执行SQL语句和处理结果集。mybatis是对JDBC的再一次封装,不管怎么进行包装,还是会有获取连接、preparedStatement、封装参数、执行这些步骤......
  • fullcalendar-vue3插件实现时间资源图
    用的vue3+最新版本:官网链接:https://fullcalendar.io/demos效果如图:x轴为人员,y轴为当日的时间段:  1.安装引入npminstall--save@fullcalendar/core@fullcalendar/resource@fullcalendar/resource-timegrid package.json 2.附上代码<script>import{defin......
  • P4211 [LNOI2014] LCA
    题目大意给出一个\(n\)个节点的有根树。设\(dep[i]\)表示点\(i\)的深度,\(\operatorname{LCA}(i,j)\)表示\(i\)与\(j\)的最近公共祖先。有\(m\)次询问,每次询问给出\(l,r,z\),求\(\sum_{i=l}^rdep[\operatorname{LCA}(i,z)]\)。\(1\len,m\le50000\)。思......
  • 利用MKL实现OpenCV的模板匹配(matchTemplate)
    基于FFT实现OpenCV的模板匹配(matchTemplate)以TM_CCORR_NORMED为例,因为这个实现简单,并且效率高。先看公式\[R(x,y)=\frac{\sum_{x',y'}(T(x',y')\cdotI(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2\cdot\sum_{x',y'}I(......
  • 扫描线模板
    #include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;constintN=1e6+5;//本模板是从左往右扫的,从下往上扫同理#definels(rt<<1)#definers(rt<<1|1)i64cover[N*8];//存放i节点对应区间覆盖情况的值i64n;i64len[N*8];i64yy[N*2];/......
  • template之变参模板学习
    转自:https://www.cnblogs.com/qicosmos/p/4325949.html,讲的很好1.介绍C++11的新特性--可变模版参数(variadictemplates)对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。 要用三个点来定义:template<class...T>voidf(T...args); 省略号的作用有两个:1.声明......