浅谈LCA的在线算法

最近在学双连通分量,做到一个题,是LCA的,不会做就来学习了一下LCA,发现网上有好多资料,鱼龙混杂。推荐一篇因为他推荐了许多文章(感兴趣点击打开))

首先先借鉴一下他的一张图片

这基本就是这个lca的思想。

按照我的理解首先要dfs一边求出first 【u】,deep【u】,并且记录下first【u】所对应的u;

代码如下:

void dfs(int u ,int dep)
{
    vis[u] = true;
    ver[++tot] = u;
    first[u] = tot;
    deep[tot] = dep;
    for(int i=head[u]; i!=-1; i=edge[i].next)
		int v = edge[i].v;
        if( !vis[v] )
        {
            dfs(v,dep+1);
            ver[++tot] = u;
            deep[tot] = dep;//这两句话表示dfs的时候还要回溯到上面
        }
}

然后继续RMQ预处理,ST算法,这个是在上面所说的博客模板

所谓ST算法就是

令dp【i】【j】为从下标i开始,长度为(1《《j)长的元素的最小值,那么状态转移方程就是

dp【i】【j】=min{dp【i】【j-1】,dp【i+(2<<(j-1))】【j-1】}

void ST(int len)
{
    int K = (int)(log((double)len) / log(2.0));
    for(int i=1; i<=len; i++) dp[i][0] = i;
    for(int j=1; j<=K; j++)
        for(int i=1; i+_pow[j]-1<=len; i++)
        {
            int a = dp[i][j-1] , b = dp[i+_pow[j-1]][j-1];
            if(deep[a] < deep[b]) dp[i][j] = a;
            else            dp[i][j] = b;
        }
}

RMQ,原理是令k为满足(1<<k)<=(r-l+1)的最大整数,则以 l 开头的,长度为2的k次方的区间长度覆盖了查询区间(l,r),由于是求最小值,所以没有关系,但是如果是累加的话,就要错,那么他的结果就是min(dp【l】【k】,dp【r+1-(1<<k)】【k】);

int RMQ(int x ,int y)
{
    int K = (int)(log((double)(y-x+1)) / log(2.0));
    int a = dp[x][K] , b = dp[y-pow[K]+1][K];
    if(deep[a] < deep[b]) return a;
    else            return b;
}

int LCA(int u ,int v)
{
    int x = first[u] , y = first[v];//查找出他最先出现的地方
    if(x > y) swap(x,y);
    int res = RMQ(x,y);//查询出的是他祖先的下标
    return ver[res];//查询出的是他的祖先
}

以上就是LCA转RMQ算法,然后还有一个tarjan离线算法,去学习喽

其实ST也是tarjan的,

要换床头画了

时间: 2024-11-01 12:31:17

浅谈LCA的在线算法的相关文章

hdu 3078(LCA的在线算法)

Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 847    Accepted Submission(s): 347 Problem Description The ALPC company is now working on his own network system, which is connecting all

浅谈信息加密技术和算法

1单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,不可逆的.常用的单向散列算法有MD5,SHA等. 比如网站中,用户密码,一般可以进行MD5加密后保存,用户登录时,对用户输出的密码进行加密后和数据库密文进行比较,如果一致,则验证成功. 为了加强计算的安全性,可以对数据加上密钥,增加破解的难度. 推荐使用 apache common的 commons-codec的 jar包 比如(commons-codec-1.8.jar)    

LCA(倍增在线算法) codevs 2370 小机房的树

codevs 2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花费太多精力.已知从某个节点爬到其父亲节点要花费 c 的能量(从父亲节点爬到此节点也相同),他们想找出一条花费精力最短的路,以使得搞基的时候精力旺盛,他们找到你要你设计

浅谈Miller-Rabin素数检测算法

浅谈Miller-Rabin素数检测 对于素数判断的操作,我们通常使用的是时间复杂度为\(O(\sqrt N)\)的试除法.按理说这种复杂度已经是较优秀的了,但是假如给定的需要判断的数极其之大,并且给定的时限不够以\(O(\sqrt N)\)的试除法来判断,该怎么办? 题出错了 想得美. 于是,今天的主角出场了:Miller-Rabin素数检测. Miller-Rabin素数检测算法用于在短时间内判断出一个数是否是质数,时间复杂度比试除法优秀,应该是\(O(T\times \log N)\)级别

多项式艺术:浅谈FFT和NTT算法(未完待续)

什么是多项式? 百度百科说:“由若干个单项式相加组成的代数式叫做多项式.多项式中每个单项式叫做多项式的项,这些单项式中的最高次数,就是这个多项式的次数.” 也就是说,形如的式子,就叫做多项式.这样的式子,也能写作.很显然,多项式加上(或是减上)多项式也是多项式,复杂度是的.但是,如果多项式想要乘上一个多项式,那么也可以,最简单的方法却是的. 不过,FFT算法会告诉你,就够了. 多项式乘法 我们说的,多项式想要乘上一个多项式,那就是多项式乘法,人称“卷积”.我们方才所看到的,被称为多项式的“系数表

大数质因解:浅谈Miller-Rabin和Pollard-Rho算法

2017-07-19 08:54 Amphetamine:能发一下代码吗? 应我那位谜一样好友的邀约,我打算好好看一看Miller-Rabin和Pollard-Rho算法.很奇怪,各种地方有很多代码描述详细过程,但我仍旧很懵.也许是我太弱了,不能从那些“鱼龙混杂”的代码中找出本质上的共性.那么,我们现在来讨论一下吧. 首先,大整数分解现在仍然是个世界级的难题,在“公共密钥”的研究上有着重要的作用. !!先判断质数!! 试除法:原始的根号算法 额.不想说了.正经一点. Miller-Rabin:判

浅谈Java数据结构和算法

今天的突然看集合底层的时候发现了好多算法和数据结构.再次就比较一下和汇总一下. 数据结构分类:线性结构和非线性结构 问题一: 什么是线性和非线性: 我个人的理解是:数据结构中线性结构指的是数据元素之间存在着"一对一"的线性关系的数据结构: 线性结构包括:数组,链表,队列,栈: 非线性结构包括:树,图,表: 详解: 一.线性结构 1.数组 特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询速度很快,然而插入和删除时,需要对元素移动空间,比较慢. 数组使

浅谈print2flash的在线预览转换应用(原创)

print2flash是一种在线预览转换工具,可以将doc.docx.xls.pdf.ppt等格式的文档转换成flash文件进行预览,因为之前使用的flash2paper只支持32为操作系统,不支持64为win7,所以才考虑用print2flash. 在使用过程中遇到了很多问题,下面我将遇到的问题总结一下. 1.安装以后,进行pdf转换出现系统错误,code 1155 没有应用程序与当前的操作的文件相关联,百度以后才发现是注册表的问题, 运行regedit进入注册表,删除注册表中的HKEY_CU

浅谈普通莫队算法

前言 对于一个维护区间的问题,最暴力的方法就是每次枚举区间,进行统计. 而这就是莫队的基本思路 但不过莫队的枚举是进行优化的,可以优化到\(O(N\sqrt{N})\) 基本思路 首先:已知\([L,R]\)的答案,那么求\([L-1,R]\) .\([L+1,R]\) .\([L,R-1]\).\([L,R+1]\)的代价为\(O(1)\) 如果你已知区间\([L,R]\)的答案,那么对于区间\([l,r]\),如果两个区间有交集,那么这个交集就没有必要再去计算了,所以我们只需要移动端点即可.