RMQ求LCA

RMQ和LCA详解 关于RMQ和LCA的关系的知识,如何用RMQ和LCA的转换 立即下载

落谷模板

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define MAXN 1010001
using namespace std;
int n,m,to[MAXN],nxt[MAXN],s,head[MAXN],e,pos[MAXN],dfn[MAXN],u,v,dep[MAXN],lg[MAXN];
int st[MAXN][20];
inline void add( int x,int y)
{
    e++;
    to[e]=y;
    nxt[e]=head[x];
    head[x]=e;
}
void dfs(int x,int f)
{
    dfn[++e]=x;
    pos[x]=e;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y!=f)
        {
            dep[y]=dep[x]+1;
            dfs(y,x);
            dfn[++e]=x;
        }
    }


}
int lca(int x,int y)
{
    int pc,pcc,l;
    if(pos[x]>pos[y]) swap(x,y);
    pc=pos[x];
    pcc=pos[y];
    l=lg[pcc-pc+1];
    if(dep[st[pc][l]]<dep[st[pcc-(1<<l)+1][l]])
        return st[pc][l];
        else
        return st[pcc-(1<<l)+1][l];
}
int main()
{
//  freopen("1.txt","r",stdin);
    cin>>n>>m>>s;
    memset(dep,0x7f,sizeof(dep));
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    e=0;
    dep[s]=0;
    dfs(s,0);
    lg[0]=-1;
    for(int i=1;i<=e;i++)
    {
        st[i][0]=dfn[i];
    }
    //i<=n就行了
    for(int i=1;i<=e;i++)
    {
        if((i&(i-1))==0) lg[i]=lg[i-1]+1;
        else lg[i]=lg[i-1];
    }
    for(int i=1;i<=lg[e];i++)   //j+(1<<i)-1<=e就行了
    {
        for(int j=1;j+(1<<i)-1<=e;j++)
        {
            //右边的dep[st[j+(1<<(i-1)][i-1]]!!!
            //                ↑
            //下面else里也是
            if(dep[st[j][i-1]]<dep[st[j+(1<<(i-1))][i-1]])
            st[j][i]=st[j][i-1];
            else st[j][i]=st[j+(1<<(i-1))][i-1];
        }   
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        printf("%d\n",lca(u,v));
    }
}
rk3399 hdmi HDCP key烧录 1.key转换 使用 hdcp\ProvisioningTool_20170526\KeyConverterV2.02 目录下的KeyConvertor.exe工具将1.4key进行转换 转换后得到 TX00000001.skf 文件,将 TX00000001.skf 文件烧录到开发板上,烧录方式: 打开文件 hdcp\ProvisioningTool_20170526\ProvisioningTool20170526\ProvisioningTool.exe 选择烧录方式与烧录路... 阅读详情

相关推荐

基于qiime2的16S数据分析全流程:从导入数据到下游分析一条龙

基于qiime2的16s测序数据分析分析激活qiime环境我已经把上面这句代码放在了.bashrc里面,因此激活qiime2环境只需要运行activate_qiime即可/bin/bash# 设置目录路径# 输出表头 echo -e "sample-id\tforward-absolute-filepath\treverse-absolute-filepath"# 遍历_R1和_R2文件do # 检查R1文件是否存在then# 获取样本ID(去掉_R1.fastq.gz)

2301_76771985的博客 5521

求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

P3379 【模板】最近公共祖先(LCA) #include<bits/stdc++.h> using namespace std; struct Edge { int to,next; }edge[500005*2];//无向图,两倍开 int head[500005],grand[500005][21],depth[500005],lg[500001]; int cnt,n,m,s; inline int read() { int x=0,f=1;char ch=getch.

春弦的博客 6968

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1996

倍增 || ST-RMQ 求LCA

视频讲解戳这里(bj聚聚讲的非常好,一听就懂) 由luogu一道模板题讲起传送门(都9102年,这题还卡输入输出,要吸氧才能过) LCA:求两个点的最近公共祖先 倍增求LCA: 有很多博客图文并茂讲的非常清楚,倍增LCA的主要思想就是,先将u,v(保证u的深度更深)两点调整到同一水平线 情况一:u==v,那就说明最近公共祖先是u,这种情况说明u,v在同一边,祖先自然是深度较浅的那一个...

一只不争气的蒸汽机的博客 345

使用Intel编译器编译OpenFOAM

本文总结了使用INTEL编译器编译OpenFOAM的过程

姜蜉蝣的博客 1547

8.Python基础语法(五)续【光说不练假把式,上题】

Python基础语法(二) 有关于Python循环语句的几道实操,让大家理解知识点更深更透彻~

孤寒者的博客 2万+

LCA(最近公共祖先)+RMQ(区间最值)详解

LCA(最近公共祖先) 首先区别祖先和父亲节点:比如4的父亲节点是2,祖先节点是2,1 。5的父亲节点是2,祖先节点是2,1 求解最近公共祖先,比如要求解4和3的最近公共祖先就是1。4和5的最近公共祖先就是2 求解最近公共祖先的方法有很多,比如最简单暴力的方法就是一个一个向上找 还有就是倍增优化,用欧拉序加上ST表。 暴力求解LCA #include<bits/stdc++.h&...

ReverieZH的博客 1255

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

算法大师! 791

RMQ求LCA【ST】算法

RMQ求LCA其实非常简单的啦 我们需要理解两个基本的工具: 1.欧拉序列; 2.线段树,二叉搜索树或者其它基本区间寻求最值的方法; 所以说LCA和区间有什么关系? 举个栗子: 我们将欧拉序列E打出: 【1,2,4,2,5,2,1,3,6,3,1】(先自己想想怎么实现) 在打印序列的同时记录下每个节点第一次出现的位置R 【1,2,8,3,5,9】 另外别忘了给欧拉序列标深度...

Wyt_code的博客 1093

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3837

量化交易python代码解析:从狙击手算法到最优限价算法

在金融市场的竞技场上,量化交易如同一位冷静的策略大师,它以数学模型为剑,以计算机程序为盾,精准出击,捕捉市场的微妙波动。本文将深入探讨五种核心量化交易算法:直接委托算法(DMA)、时间加权平均算法(TWAP)、冰山算法(Iceberg)、狙击手算法(Sniper)、条件委托算法(Stop)以及最优限价算法(BestLimit),揭开它们背后的运作机制与实战应用。

木头大左的博客 1884

[算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子)

每周五篇博客:(3/5)

Resot的博客 1459

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)

题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各有利弊吧,实现复杂度参考我自己,如果有代码大佬能闭着眼随便写的话,忽略即可 Orz 树上倍增求LCA: 时间复杂度: 预处理:O( nlogn ) 查询:O( logn ) 空间复杂度:O( nlogn ) 实现复杂度:最简单 树链剖分求LCA: 时间复杂度: 预处理:O( n )

Falcon的博客 566

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

dfs序+RMQ求LCA详解

首先安利自己倍增求LCA的博客,前置(算不上)知识在此。 LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说。),还有,标题。 是的你也来和我一起学习这个了qwq。 开始吧。 众所周知,每当你dfs时,你都能产生一棵dfs树,可以根据你的dfs序来构建。 such as(丑陋的画风): 一个dfs的顺序。 以这个为例:...

weixin_30916125的博客 872

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

利用RMQ -ST求 LCA

描述上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的“最近公共祖先”网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定到底是针对这个询问就直接进行计算还是等待一定数量的询问一起计算。毕竟无论是一个询问还是很多个询问,使用离线算法都是只需要做一次深度优先搜索就可以了的。那么问题就来了,如果每次计算都只针对一个询问进行的话,那么这样的算法事实...

a1046765624的博客 549

RMQ在线求LCA

#include<bits/stdc++.h>using namespace std;#define begin Begin #define next Next #define rank Rank#define REP(i, a, b) for (int i = (a), _end_ = (b); i <= _end_; ++i) #define ER(i, a) for (int i = begi

Free Loop~~~跳动的恒星 778

RMQ求LCA(自用记录)

//因为我st表中记录的是欧拉序的下标,所以deep[]应该是记录欧拉序下标的deep //RMQ 是对欧拉序 进行处理!!! //为什么st表中存下标,而不是deep, //因为我们求的是节点,而不是deep的值,如果知道最小的deep而求lca的话 //在一个树中,一个深度会由很多的点构成,所以知道deep是无法求出所对应的节点的 //而知道在ol中的下标,则可唯一确定一个顶点,与之对应,及LCA. # include<bits/stdc++.h> # define rep(i,be,en)

rickwang000的博客 295

ST(RMQ)算法(在线)求LCA

在此之前,我写过另一篇博客,是倍增(在线)求LCA。有兴趣的同学可以去看一看。概念以及各种暴力就不在这里说了,那篇博客已经有介绍了。 不会ST算法的同学点这里ST(RMQ)算法在线求LCA这个算法的思想,就是将LCA问题转化成RMQ问题。怎么将LCA转成RMQ?我们首先用dfsO(N)遍历一遍。比如下图: 得到一个dfs序(从儿子回到父亲也要算一遍): 1->2->4->7->4->8->

A1847225889的博客 1107

RMQ求LCA模板:

//#pragma comment(linker,"/STACK:327680000,327680000") #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <al...

weixin_30763455的博客 79

BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交

题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市。Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道。机智的Hzwer在宾馆中修建了N-1条隧道,也就是说,宾馆和隧道形成了一个树形结构。Hzwer有时候会花一天时间去视察某个城市,当来到一个城市之后,Hzwer会分析这些宾馆的顾客情况。对于每个顾...

weixin_33895475的博客 215
上一篇: SPFA模板
下一篇: spfa+位运算 2017.10.9 t3
pcccc0616
博客等级 码龄10年 13粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值