倍增(LCA与ST表)练习题

前导知识

最近公共祖先,ST表

1. 【模板题】最近公共祖先(LCA)

传送门

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 5e5 + 5;
struct node{int v,next;
}e[N<<1];
int head[N],tot;
int fa[N][22],dep[N];
void add_edge(int u,int v){e[++tot].v=v;e[tot].next=head[u];head[u]=tot;
}
void dfs(int s,int dad){fa[s][0]=dad,dep[s]=dep[dad]+1;for(int i=1;i<20;i++){fa[s][i]=fa[fa[s][i-1]][i-1];}for(int i=head[s];i;i=e[i].next)if(e[i].v!=dad) dfs(e[i].v,s);
}
int LCA(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(int i=19;i>=0;i--)if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];if(x==y) return x;for(int i=19;i>=0;i--){if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];}return fa[x][0];
}
int main(){int n,m,s;scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n-1;i++){int x,y;scanf("%d%d",&x,&y);add_edge(x,y);add_edge(y,x);}dfs(s,0);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",LCA(x,y));}return 0;
}

2. 【模板】ST表

传送门

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e6 + 5;
int lg[N],st[N][22];
inline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}
int query(int l,int r){int k=log2(r-l+1);return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main(){int n=read(),m=read();for(int i=1;i<=n;i++) st[i][0]=read();for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;for(int j=1;j<=lg[n];j++){for(int i=1;i+(1<<j)-1<=n;i++)st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}for(int i=1;i<=m;i++){int l=read(),r=read();printf("%d\n",query(l,r));}return 0;
}

倍增(LCA与ST表)相关推荐

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

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

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

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

  3. LCA RMQ+ST表学习笔记

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

  4. hdu6107 倍增法st表

    发现lca的倍增解法和st表差不多..原理都是一样的 /* 整篇文章分成两部分,中间没有图片的部分,中间有图片的部分 分别用ST表求f1,f2表示以第i个单词开始,连续1<<j行能写多少单 ...

  5. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

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

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

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

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

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

    目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...

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

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

  10. RMQ问题-ST表倍增处理静态区间最值

    简介 ST表是利用倍增思想处理RMQ问题(区间最值问题)的一种工具. 它能够做到O(nlogn)预处理,O(1)查询的时间复杂度,效率相当不错. 算法 1.预处理 ST表利用倍增的思想.以洛谷的P38 ...

最新文章

  1. 如何判断哪个商城系统好?
  2. Python中解决ModuleNotFoundError: No module named 'tensorflow._api'问题
  3. postGIS相关数据库参数
  4. django手机访问_Django从入门到大作业:2-见网页
  5. linux(ubuntu)给vmware中的windows虚拟机共享磁盘
  6. applicationproperties不是小叶子_为何“砂糖桔”是带着叶子出售?原来其中有着“猫腻”,涨知识了...
  7. centos7/rhel7安装较高版本ruby2.2/2.3/2.4+
  8. dj鲜生-13-类视图-使用篇
  9. 《JAVA与模式》之观察者模式
  10. 跟小廖一起学习Python正则表达式!
  11. linux下telnet到h3c交换机Backspace无效
  12. zabbix监控之邮件报警通知
  13. 多个切点 boot spring_spring基于aspectJ的切点表示
  14. nba2k20手游修改器服务器已到,NBA2K20手机版万能修改器
  15. 角色攻击、角色特殊动作
  16. python小练习6--lambda表达式的使用
  17. 互联网产品经理职业规划图(转载)
  18. c++和c语言之间有什么区别
  19. 【转载】采样频率、采样点数、频率分辨率
  20. 办公室文秘试题 计算机,文秘计算机练习测验题.doc

热门文章

  1. 3x3矩阵怎么求逆矩阵_矩阵型组织结构,郭士纳与任正非都是怎么说的?
  2. larveral 直接拷贝安装_2020年mac系统下制作win10引导安装盘,亲测可用
  3. Day 45 Ansible批量管理
  4. 0920 - 积极休息
  5. pg_stat wait timeout
  6. Hive基本原理及环境搭建
  7. NETDOM的几个用法
  8. Python学习笔记1—Python字符串
  9. 设计网际网络的地址标准
  10. 大数据概念思维导图_【数据整理】一份思维导图,学完Tableau Prep(下)