题目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. Git 常用命令简单记录

    分布式版本控制系统,跟踪文本文件的改动 ubuntu安装: sudo apt install git 安装完成后,设置使用的用户名和邮箱: 全局: git config --global user.n ...

  2. BZOJ3625 CF438E 小朋友与二叉树

    心态崩了 不放传送门了 辣鸡bz 还是正经一点写一下题解= = 就是显然我们可以把权值写成生成函数形式g(0/1序列)来表示权值是否出现 然后f来表示总的方案数 可以列出 分别枚举左右子树和空树的情况 ...

  3. sql语句中判断空值的函数

    COALESCE()函数 主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式如下:  COALESCE ( expression,value1,value2……,v ...

  4. boost serialization

    Archive An archive is a sequence of bytes that represented serialized C++ objects. Objects can be ad ...

  5. Struts2基础-2 -实现Action接口创建Action控制器

    1.新建一个web项目,目录结构如下,添加jar包到lib文件夹里,并把jar包add 到 buildpath里面 2.web.xml配置 struts2的过滤器类:StrutsPrepareAndE ...

  6. SSM项目用ajax来显示数据

    <script type="text/javascript"> //1:页面加载完成后,直接去发送ajax请求,要到分页的数据 $(function(){ $.ajax ...

  7. spring-cloud:Hystrix熔断的使用示例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCl ...

  8. jquery设置、判断、获取input单选标签选中状态

    1.设置某项单选input为选中状态: $("input[type='radio']").eq(1).attr('checked',true); ②也可设其属性checked为'c ...

  9. webbrowser控件显示word文档

    参照某网站上的步骤(http://www.kuqin.com/office/20070909/968.html)首先,在Visual Studio中创建一个C#语言的Windows应用程序,然后在左侧 ...

  10. Centos7.4 配置之MySQL 8.0【转】

    首先查看Mysql最新版本, 此时,目前最新版本为8.0. 开始安装前需要一些准备工作. 1,将本地的MariaDB或者已经安装的MySQL其他版本卸载. (一)卸载本地的本地的MariaDB: 由于 ...