区间节点的lca
分析:多节点的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的更多相关文章
- 面试题6:二叉树最近公共节点(LCA)《leetcode236》
Lowest Common Ancestor of a Binary Tree(二叉树的最近公共父亲节点) Given a binary tree, find the lowest common an ...
- 区间最深LCA
求编号在区间[l, r]之间的两两lca的深度最大值. 例题. 解:口胡几种做法.前两种基于莫队,第三种是启发式合并 + 扫描线,第四种是lct + 线段树. ①: 有个结论就是这个答案一定是点集中D ...
- [hdu5266]区间LCA
题意:给一棵树,求节点L,L+1,...R的最近公共祖先 思路:先对树dfs一下,从根1出发,经过每条边时记录一下终点和到达这个点的时间截,令r[u]表示到达u这个节点的最早时间截,t[x]表示在时间 ...
- LCA + 树状数组 + 树上RMQ
题目链接:http://poj.org/problem?id=2763 思路:首先求出树上dfs序列,并且标记树上每个节点开始遍历以及最后回溯遍历到的时间戳,由于需要修改树上的某两个节点之间的权值,如 ...
- 浅谈 LCA
LCA问题 一.概述: 在图论与计算科学中,两个节点 v 与 w 在有向无环图( directed acyclic graph , DAG )或树中的最近公共祖先(Lowest common ancc ...
- 【算法】RMQ LCA 讲课杂记
4月4日,应学弟要求去了次学校给小同学们讲了一堂课,其实讲的挺内容挺杂的,但是目的是引出LCA算法. 现在整理一下当天讲课的主要内容: 开始并没有直接引出LCA问题,而是讲了RMQ(Range Min ...
- LCA算法解析-Tarjan&倍增&RMQ
原文链接http://www.cnblogs.com/zhouzhendong/p/7256007.html UPD(2018-5-13) : 细节修改以及使用了Latex代码,公式更加美观.改的过程 ...
- LCA转换成RMQ
LCA(Lowest Common Ancestor 最近公共祖先)定义如下:在一棵树中两个节点的LCA为这两个节点所有的公共祖先中深度最大的节点. 比如这棵树 结点5和6的LCA是2,12和7的LC ...
- 求 LCA 的三种方法
(YYL: LCA 有三种求法, 你们都知道么?) (众神犇: 这哪里来的傻叉...) 1. 树上倍增 对于求 LCA, 最朴素的方法是"让两个点一起往上爬, 直到相遇", &qu ...
随机推荐
- mitdump爬取当当网APP图书目录
因为mitmproxy没办法连接数据库所以,只能先把结果保存为txt文件,再读取到数据库中. 在滑动APP界面时,对代码进行分析 import requests import re import ur ...
- js本地时间格式化
var myDate = new Date(); //获取当前时间及日期 var year=myDate.getYear(); // 获取当前年份(当前年份-1900) var fyear=myDat ...
- RestController和Controller的区别
知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用. 1) 如果只是使用@RestController注解Controller,则Co ...
- 如何卸载不用的VDP
1.首先删除VDP 2.登录AD的DNS当中,删除VDP对应的DNS解析 3.1登陆 https://vcenterip/mob 这个地址. 输入你的管理员账号密码. 3.2进入content链接. ...
- P与C
P是排列:与次序有关,P(5.3)=5*4*3 C是组合:与次序无关,C(5.3)=(5*4*3)/(3*2*1)
- Java打印流学习
打印流 打印流的主要功能是用于输出,在整个IO包打印流分为两种类型,打印流可以很方便的进行输出. 1.字节打印流:PrintStream(在字节输出时,可以增强输出功能) 2.字符打印流:PrintW ...
- windows下zookeeper单机版安装+dubbo-admin安装注意点
一:zookeeper安装 安转包下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper 复制修改conf下的zoo_sample.cfg为zoo.cf ...
- ASP.NET MVC中的捆绑和压缩技术
概述 在众多Web性能优化的建议中有两条: 减少Http请求数量:大多数的浏览器同时处理向网站处理6个请求(参见下图),多余的请求会被浏览器要求排队等待,如果我们减少这些请求数,其他的请求等待的时间将 ...
- vue中路由传参的方式
一.params的类型: 配置路由格式: /router/:id 传递的方式: 在path后面跟上对应的值 传递后形成的路径: /router/123, /router/abc 通过:to字符串拼接的 ...
- LeetCode算法题
1.给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 时间复杂度待优化 class Solution { public int findLength(int[] A, in ...