板子测试POJ1330,一发入魂,作者是KuangBin神犇,感谢?‍

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 10010;
int rmq[2 * MAXN];          //  rmq数组,就是欧拉序列对应的深度序列struct ST
{int mm[2 * MAXN];int dp[2 * MAXN][20];     //  最小值对应的下标void init(int n){mm[0] = -1;for (int i = 1; i <= n; i++){mm[i] = ((i & (i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];dp[i][0] = i;}for (int j = 1; j <= mm[n]; j++){for (int i = 1; i + (1 << j) - 1 <= n; i++){dp[i][j] = rmq[dp[i][j - 1]] < rmq[dp[i + (1 << (j - 1))][j - 1]] ? dp[i][j - 1] : dp[i + (1 << (j - 1))][j - 1];}}}int query(int a,int b)  //  查询[a,b]之间最小值的下标{if (a > b){swap(a, b);}int k = mm[b - a + 1];return rmq[dp[a][k]] <= rmq[dp[b - (1 << k) + 1][k]] ? dp[a][k] : dp[b - (1 << k) + 1][k];}
};//  边的结构体定义
struct Edge
{int to, next;
};Edge edge[MAXN * 2];int tot, head[MAXN];
int F[MAXN * 2];        //  欧拉序列,就是dfs遍历的顺序,长度为2*n-1,下标从1开始
int P[MAXN];            //  P[i]表示点i在F中第一次出现的位置
int cnt;
ST st;void init()
{tot = 0;memset(head, -1, sizeof(head));
}void addedge(int u, int v)   //  加边,无向边需要加两次
{edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
}void dfs(int u, int pre, int dep)
{F[++cnt] = u;rmq[cnt] = dep;P[u] = cnt;for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v == pre){continue;}dfs(v, u, dep + 1);F[++cnt] = u;rmq[cnt] = dep;}
}void LCA_init(int root, int node_num)   //  查询LCA前的初始化
{cnt = 0;dfs(root, root, 0);st.init(2 * node_num - 1);
}int query_lca(int u, int v)             //  查询u,v的lca编号
{return F[st.query(P[u], P[v])];
}
bool flag[MAXN];int main()
{int T;int N;int u, v;scanf("%d", &T);while(T--){scanf("%d", &N);init();memset(flag, false, sizeof(flag));for (int i = 1; i < N; i++){scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);flag[v] = true;}int root;for (int i = 1; i <= N; i++){if (!flag[i]){root = i;break;}}LCA_init(root, N);scanf("%d%d", &u, &v);printf("%d\n", query_lca(u, v));}return 0;
}

图论--LCA--在线RMQ ST相关推荐

  1. LCA在线算法ST算法

    求LCA(近期公共祖先)的算法有好多,按在线和离线分为在线算法和离线算法. 离线算法有基于搜索的Tarjan算法较优,而在线算法则是基于dp的ST算法较优. 首先说一下ST算法. 这个算法是基于RMQ ...

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

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

  3. 看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)

    首先请看定义: 一.最近公共祖先(Least Common Ancestors) 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...

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

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

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

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

  6. LCA RMQ+ST表学习笔记

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

  7. LCA(包含RMQ)

    今天看了RMQ问题 ST的实质是动归 于是我来回顾一下LCA(的各种写法) 因为每次考试发现自己连LCA都写不好 费时 First of all, RMQ板子: [一维] #include<bi ...

  8. RMQ ST算法简介

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

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

    题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...

最新文章

  1. linux打开 root .m2,小辣椒M2 (LA-M2)获取ROOT权限教程,新手root必看
  2. jquery 半透明遮罩效果 小结
  3. Acwing第 9 场周赛【未完结】
  4. E: 您必须在 sources.list 中指定代码源(deb-src) URI 解决办法
  5. Android记录一个setTextColor常见的一个bug
  6. Django websocket 长连接使用
  7. 基于php的地铁查询系统,HTML5 Canvas实现交互式地铁线路图
  8. 用原生JavaScript实现简单轮播图
  9. UE4学习-自定义相机视图
  10. JPA教程:映射实体–第1部分
  11. keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?
  12. 韩国浦项化学在中国斥资超2800亿韩元投建电动车电池材料厂
  13. 28. 字符串的排列(C++版本)
  14. Python高性能编程
  15. 大学,不是学习的终点,而是起点。
  16. 2015年imac一体机安装双系统问题及解决技巧
  17. 【Netty基础】基于HTTP的文件下载Server实例
  18. 步进电机及驱动芯片选型指南
  19. SAP外协加工业务中事务MBLB与ME2O的应用区别分析
  20. ott盒子 MySQL_mysql双A同步搭建Otter一键部署教程

热门文章

  1. java反射减少servlet_利用java 反射机制来实现一个servlet处理多种请求
  2. 制定交叉编译工具_配置交叉编译工具链-嵌入式Linux
  3. 语言android编程规范,计算机语言编程规范-在路上.PDF
  4. linux下screen版本,在Linux (RHEL/CentOS 7/8 )中,如何使用4个简单步骤安装Screen命令
  5. iPhone 路径大全
  6. LVM逻辑卷的管理--创建LVM、扩容,快照实战
  7. iOS新上线注意事项
  8. linux 的基本命令
  9. MySQL 备份和恢复
  10. 战双帕弥什显示服务器满员,战双帕弥什星火和信标服务器有何区别