题目hdu5266

分析:多节点的LCA就是dfs序中最大最小两个节点的LCA。所以只要每次维持给出节点的dfs序的最大最小,然后就是两点的LCA

代码:

rmq的st+lca的倍增

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
const int max_=;
int n;
int edge[max_*];
bool vis[max_];
int deep[max_];
int p[max_][];
int dp_min[max_][];
int dp_max[max_][];
int a[max_];
//int smax[max_][25],smin[max_][23];
int tot,idx;
void init()
{
tot=;
memset(edge,-,sizeof(edge));
idx=;
memset(vis,,sizeof(vis));
memset(deep,,sizeof(deep));
memset(p,-,sizeof(p));
}
struct tree{
int to;
int next;
}G[max_*]; void add_edge(int u,int v)
{
G[++tot].to=v;
G[tot].next=edge[u];
edge[u]=tot;
}
void dfs(int u)
{
vis[u]=;
a[u-]=idx++;
for(int i=edge[u];~i;i=G[i].next)
{
int v=G[i].to;
if(!vis[v])
{
p[v][]=u;
deep[v]=deep[u]+;
dfs(v);
}
}
}
int Max(int x,int y)
{
if(a[x]>a[y])
return x;
else
return y;
}
int Min(int x,int y)
{
if(a[x]>a[y])
return y;
else
return x;
}
void st_init()
{
for(int i=;i<n;i++)
{
dp_max[i][]=i,
dp_min[i][]=i;
}
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<n;i++)
{
dp_max[i][j]=Max(dp_max[i][j-],dp_max[i+(<<(j-))][j-]);
dp_min[i][j]=Min(dp_min[i][j-],dp_min[i+(<<(j-))][j-]);
}
}
int st_q_max(int l,int r)
{
int k=;
while((<<(k+))<=r-l+)
k++;
return Max(dp_max[l][k],dp_max[r-(<<k)+][k]);
}
int st_q_min(int l,int r)
{
int k=;
while((<<(k+))<=r-l+)
k++;
return Min(dp_min[l][k],dp_min[r-(<<k)+][k]);
}
void lca_init()
{
for(int j=;(<<j)<=n;j++)
for(int i=;i<=n;i++)
if(~p[i][j-])
p[i][j]=p[p[i][j-]][j-];
}
int lca(int u,int v)
{
if(deep[u]<deep[v])//u_max;
swap(u,v);
int k=deep[u]-deep[v];
for(int i=;(<<i)<=k;i++)
{
if((<<i)&k)
u=p[u][i];
}
if(u==v)
return u;
int N=log2((double)n);
for(int i=N;i>=;i--)
{
if(p[u][i]!=p[v][i])
{
u=p[u][i],
v=p[v][i];
}
}
return p[u][];
}
int main()
{
while(~scanf("%d",&n)){
init();
int u,v;
for(int i=;i<n;i++)
{
scanf("%d %d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
dfs();
st_init();
int Q;
scanf("%d",&Q);
lca_init();
while(Q--)
{
int l,r;
scanf("%d %d",&l,&r);
l--,r--;
int id_max=st_q_max(l,r)+;
int id_min=st_q_min(l,r)+;
printf("%d\n",lca(id_max,id_min));
}
}
}

区间节点的lca的更多相关文章

  1. 面试题6:二叉树最近公共节点(LCA)《leetcode236》

    Lowest Common Ancestor of a Binary Tree(二叉树的最近公共父亲节点) Given a binary tree, find the lowest common an ...

  2. 区间最深LCA

    求编号在区间[l, r]之间的两两lca的深度最大值. 例题. 解:口胡几种做法.前两种基于莫队,第三种是启发式合并 + 扫描线,第四种是lct + 线段树. ①: 有个结论就是这个答案一定是点集中D ...

  3. [hdu5266]区间LCA

    题意:给一棵树,求节点L,L+1,...R的最近公共祖先 思路:先对树dfs一下,从根1出发,经过每条边时记录一下终点和到达这个点的时间截,令r[u]表示到达u这个节点的最早时间截,t[x]表示在时间 ...

  4. LCA + 树状数组 + 树上RMQ

    题目链接:http://poj.org/problem?id=2763 思路:首先求出树上dfs序列,并且标记树上每个节点开始遍历以及最后回溯遍历到的时间戳,由于需要修改树上的某两个节点之间的权值,如 ...

  5. 浅谈 LCA

    LCA问题 一.概述: 在图论与计算科学中,两个节点 v 与 w 在有向无环图( directed acyclic graph , DAG )或树中的最近公共祖先(Lowest common ancc ...

  6. 【算法】RMQ LCA 讲课杂记

    4月4日,应学弟要求去了次学校给小同学们讲了一堂课,其实讲的挺内容挺杂的,但是目的是引出LCA算法. 现在整理一下当天讲课的主要内容: 开始并没有直接引出LCA问题,而是讲了RMQ(Range Min ...

  7. LCA算法解析-Tarjan&倍增&RMQ

    原文链接http://www.cnblogs.com/zhouzhendong/p/7256007.html UPD(2018-5-13) : 细节修改以及使用了Latex代码,公式更加美观.改的过程 ...

  8. LCA转换成RMQ

    LCA(Lowest Common Ancestor 最近公共祖先)定义如下:在一棵树中两个节点的LCA为这两个节点所有的公共祖先中深度最大的节点. 比如这棵树 结点5和6的LCA是2,12和7的LC ...

  9. 求 LCA 的三种方法

    (YYL: LCA 有三种求法, 你们都知道么?) (众神犇: 这哪里来的傻叉...) 1. 树上倍增 对于求 LCA, 最朴素的方法是"让两个点一起往上爬, 直到相遇", &qu ...

随机推荐

  1. 记一次sql索引颠覆认知

    首先先建立数据库和插入数据 我们要查询的命令如下,前提是以mysql数据库为准 , 结果和我想的不太一样,先准备好环境和所需的数据库和表 准备阶段 CREATE TABLE `test` ( `id` ...

  2. zabbix3.4.8配置自动发现主机并监控

    一.       自动发现功能简介 Zabbix服务器端通过网络或者主机名等方式进行客户端的扫描发现,从进行加入到监控的主机队列中,适用于批量加入多主机监控的场景. 二.       自动发现功能实施 ...

  3. Windows server 2012/2016系统安装zabbix3.2客户端

    一.       上传zabbix客户端文件 将zabbix_agents_3.2.0.win.zip文件上传至服务器的指定路径. 二.       解压并修改相关信息 解压已上传的客户端文件,在co ...

  4. U盘装CENTOS操作系统

    一.制作U盘系统镜像 1).用UltralISO软件打开下载好的ISO文件镜像,“文件”-“打开”,选中下载好的ISO镜像 2)点击“启动”-“写入硬盘镜像”,选中需要写入的U盘(容量最少为8G),点 ...

  5. JAVA中位数排序

    package quickSort; public class QuickSort { private static int count; /** * 测试 * @param args */ publ ...

  6. 安装Windows与CentOS双系统

    1.安装Windows系统 安装过程除了分区时要预留出部分空间来安装CentOS之外,其它操作与正常安装一样. 2.安装CentOS系统 使用光盘引导安装,因安装为服务器版,建议选择无界面,最小化安装 ...

  7. gensim Load embeddings

    gensim package from gensim.models.keyedvectors import KeyedVectors twitter_embedding_path = 'twitter ...

  8. Delphi abstract error异常

    今天在编译之前的一个的项目时, 退出程序时出现abstract error抽象错误的异常, 点击Continue又出现释放对象的异常, 百思不得其解, 之前还好好的,突然这样了, 经过一上午的调试, ...

  9. vue循环渲染变量类样式

    由于需求的需要,将五种不同的颜色样式通过v-for进行遍历渲染,所以我这里采用绑定类函数进行判断方式.代码: 效果: 灵感来自:https://www.jianshu.com/p/33e181be3d ...

  10. BZOJ 5296: [Cqoi2018]破解D-H协议(BSGS)

    传送门 解题思路 \(BSGS\)裸题??要求的是\(g^a =A (mod\) \(p)\),设\(m\)为\(\sqrt p\),那么可以设\(a=i*m-j\),式子变成 \[ g^{i*m-j ...