介绍一种解决最近公共祖先的在线算法,st表,它是建立在线性中的rmq问题之上。

 

代码:

 

  1 //LCA: DFS+ST(RMQ)
  2
  3 #include<cstdio>
  4 #include<cctype>
  5 #include<iostream>
  6 using namespace std;
  7
  8 const int size=500010;
  9 int n,m,s,tot;
 10 int first[size],log[size<<1],f[size<<1][60],head[size<<1],p[size<<1][60];
 11 bool vis[size];
 12 struct node1
 13 {
 14     int path,depth;
 15 }a[size*2];
 16 struct node2
 17 {
 18     int next,to;
 19 }e[size*2];
 20
 21 inline int read()
 22 {
 23     int x=0,f=1;
 24     char c=getchar();
 25     while (!isdigit(c))
 26         f=c=='-'?-1:1,c=getchar();
 27     while (isdigit(c))
 28         x=(x<<1)+(x<<3)+(c^48),c=getchar();
 29     return x*f;
 30 }
 31
 32 inline int write(int x)
 33 {
 34     if (x<0)
 35         x=-x;
 36     if (x>9)
 37         write(x/10);
 38     putchar(x%10+48);
 39 }
 40
 41 inline void add(int from,int to)
 42 {
 43     ++tot;
 44     e[tot].to=to;
 45     e[tot].next=head[from];
 46     head[from]=tot;
 47 }
 48
 49 inline void logn()
 50 {
 51     int i;
 52     log[0]=-1;
 53     for (i=1;i<=n*2+1;i++)
 54         log[i]=log[(i>>1)]+1;
 55 }
 56
 57 inline void DFS(int x,int dep)
 58 {
 59     a[++tot].path=x;
 60     a[tot].depth=dep;
 61     first[x]=tot;
 62     vis[x]=true;
 63     for (int i=head[x];i;i=e[i].next)
 64         if (!vis[e[i].to])
 65         {
 66             DFS(e[i].to,dep+1);
 67             a[++tot].path=x;
 68             a[tot].depth=dep;
 69         }
 70 }
 71
 72 inline void ST()
 73 {
 74     int i,j;
 75     for (i=1;i<=tot;i++)
 76         f[i][0]=i;
 77     for (j=1;j<=log[tot];j++)
 78         for (i=1;i+(1<<j)<=tot;i++)
 79         {
 80             if (a[f[i][j-1]].depth<a[f[i+(1<<j-1)][j-1]].depth)
 81                 f[i][j]=f[i][j-1];
 82             else
 83                 f[i][j]=f[i+(1<<j-1)][j-1];
 84         }
 85 }
 86
 87 inline int RMQ(int l,int r)
 88 {
 89     int w=log[r-l+1];
 90     return a[f[l][w]].depth<a[f[r-(1<<w)+1][w]].depth?f[l][w]:f[r-(1<<w)+1][w];
 91 }
 92
 93 inline int LCA(int u,int v)
 94 {
 95     int x=first[u],y=first[v];
 96     if (x>y)
 97         swap(x,y);
 98     return a[RMQ(x,y)].path;
 99 }
100
101 int main()
102 {
103     int i,j,x,y;
104     n=read();
105     m=read();
106     s=read();
107     logn();
108     for (i=1;i<n;i++)
109     {
110         x=read();
111         y=read();
112         add(x,y);
113         add(y,x);
114     }
115     tot=0;
116     DFS(s,1);
117     ST();
118     while (m--)
119     {
120         x=read();
121         y=read();
122         write(LCA(x,y));
123         putchar(10);
124     }
125     return 0;
126 }

转载于:https://www.cnblogs.com/Ronald-MOK1426/p/8999211.html

LCA 算法(一)ST表相关推荐

  1. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

  2. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  3. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析

    目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...

  4. szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法

    昨天我们讲述了树状数组今天我们来讲ST表(解决静态RMQ (Rang Minmum/Maximum Query)问题的数据结构) 假如说我们暴力去查询区间的最值得话每次操作都是O(n) 如果询问次数跟 ...

  5. LCA RMQ+ST表学习笔记

    RMQ RMQ问题:在给定的一个长度位N的区间中,有M个询问,每次询问给出区间[L,R],求出区间段元素的 最大值/最小值.对于RMQ问题很容易想到遍历的做法,将区间[L,R]中的元素遍历一遍,即可寻 ...

  6. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  7. 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA

    传送门 写在前面:一天下来就写了两道主席树的题--(codevs上的一道智障天梯不算) 思路: 才知道原来主席树不仅可以通过dfs序维护子树区间,还可以直接维护一条到根的链-- 我们建好主席树后,每次 ...

  8. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1567  Solved: 718 [Submit][Statu ...

  9. poj3264(ST表模版)

    ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:求解范围内最高的奶牛和最短的奶牛之 ...

最新文章

  1. 第十五周程序阅读-范型程序设计(2)
  2. Mac上运行第一个Hadoop实例
  3. C#并行编程中的Parallel.Invoke
  4. 工厂三兄弟之工厂方法模式
  5. php ajax实现分页效果
  6. 什么是CDN ,CDN的作用
  7. Apache OpenJPA 2.1.0 发布
  8. linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)
  9. 金融情报挖掘:面向公开文本的期货事件聚合与传导因素分析
  10. linux 修改php配置,PHP部署时的几个配置修改说明
  11. 游戏筑基开发之测试篇2(C语言)
  12. 【板绘必读】完全0基础如何学板绘?
  13. 接待员如何向客人upsell_酒店前厅部概述-.ppt
  14. 线段树+平衡树(STL) 勤快的love 枫
  15. 如何搭建DHCP服务器及自动获取IP地址及相关操作
  16. 历年奥斯卡获奖影片(1927—2014)
  17. 服务器修改bios中uefi,服务器bios uefi设置
  18. 『自己的工作4』TensorFlow2.0自动微分和手工求导的结果对比!
  19. 安卓版的PanDownload 下载网盘资源
  20. Auto.js学习笔记1:开发需要准备什么工具和编程语言知识?

热门文章

  1. 蓝桥杯BASIC-28 基础练习 Huffuman树
  2. request.getInputStream中文乱码解决方案
  3. ArcGIS9.3 SDE安装
  4. 解决beego中同时开启http和https时,https端口占用问题
  5. 系统集成管理师2011下半年软考透解 四
  6. 虚拟化--vsphere排错组件归纳
  7. Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题
  8. iOS(iPhone/iPad)开发新手必读
  9. Evernote 全球开发者大赛最终入围作品介绍
  10. ConnectionRead (WrapperRead())Timeout expired