struct Edge{
int from, to, nex;
}edge[N<<1];
int head[N], edgenum;
void addedge(int u, int v){
Edge E = {u, v, head[u]};
edge[ edgenum ] = E;
head[u] = edgenum ++;
} inline int Max(int a,int b){return a>b?a:b;} int time;
int deep[N<<1], index[N<<1], first[N];
void DFS(int u, int dep){
deep[time] = u;
index[time] =u;
time++;
for(int i = head[u]; i !=-1; i = edge[i].nex)
{
int v = edge[i].to;
if(first[v] == 0)
{
first[v] = time;
DFS(v, dep+1);
deep[time] = u;
index[time]= u;
time++;
}
}
}
int dp[N<<1][25];//注意第二维一定要比log(n)大
void RMQ_init(int n){
for(int i = 1; i <= n; i++)
dp[i][0] = i;
for(int j = 1; (1<<j)<=n;j++)
{
int k = 1<<(j-1);
for(int i = 1; i+k<n; i++)
{
if(deep[ dp[i][j-1] ] <= deep[ dp[i+k][j-1] ])
dp[i][j] = dp[i][j-1];
else
dp[i][j] = dp[i+k][j-1];
}
}
}
int RMQ(int a,int b){
int dis = Max(a-b,b-a) +1;
int k = log(double(dis))/ log(2.0);
if(deep[dp[a][k]]<= deep[dp[b - (1<<k) +1][k]])
return dp[a][k];
else
return dp[b-(1<<k)+1][k];
}
int LCA(int u, int v){
int fu = first[u], fv = first[v];
return fu<=fv? index[ RMQ(fu,fv)] : index[ RMQ(fv,fu)];
}
void init(){
memset(head, -1, sizeof(head)); edgenum = 0;
memset(first, 0, sizeof(first));
}
void Have_Lca(int root){
first[root] = 1;
time = 1;
DFS(root, 0);
RMQ_init(time-1);
}

LCA的 RMQ解法模版的更多相关文章

  1. [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]

    参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...

  2. LCA和RMQ

    下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...

  3. ZOJ 3195 Design the city LCA转RMQ

    题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树 下面m表示m个询问,问 u v n 三点最短距离 典型的LCA转RMQ #include<std ...

  4. lca转RMQ

    这个博客写得好 #include <stdio.h> #include <vector> #include <string.h> using namespace s ...

  5. HDU 3078 LCA转RMQ

    题意: n个点 m个询问 下面n个数字表示点权值 n-1行给定一棵树 m个询问 k u v k为0时把u点权值改为v 或者问 u-v的路径上 第k大的数 思路: LCA转RMQ求出 LCA(u,v) ...

  6. 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)

    题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...

  7. LCA与RMQ

    一.什么是LCA? LCA:Least Common Ancestors(最近公共祖先),对于一棵有根树T的任意两个节点u,v,求出LCA(T, u, v),即离跟最远的节点x,使得x同时是u和v的祖 ...

  8. POJ 1986(LCA and RMQ)

    题意:给定一棵树,求任意两点之间的距离. 思路:由于树的特殊性,所以任意两点之间的路径是唯一的.u到v的距离等于dis(u) + dis(v) - 2 * dis(lca(u, v)); 其中dis( ...

  9. HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)

    题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的很easy,仅仅须要找到l-r区间内的dfs序最大的和最小的就能够.那么用线段树或者RMQ维护一下区间最值就能够了.然后就是找dfs序最大 ...

随机推荐

  1. 简单使用DESeq做差异分析

    简单使用DESeq做差异分析 Posted: 五月 06, 2017  Under: Transcriptomics  By Kai  no Comments DESeq这个R包主要针对count d ...

  2. Vsphere初试——使用Vsphere client

    好不容易安装好ESXi之后,就要安装一个Vsphere Client,为什么要安装这个东东.使用过vmware workstation的人都知道,安装完就可以添加虚拟机,但是ESXi要通过Vspher ...

  3. xml配置sql语句

  4. [SoapUI] 在SoapUI中通过Groovy脚本执行window命令杀掉进程

    //杀Excel进程 String line def p = "taskkill /F /IM EXCEL.exe".execute() def bri = new Buffere ...

  5. Spring访问数据库(方式上跟HQL类似,每行记录映射一个实体类)

    看了这篇技术博客,觉得收获较大,收藏了:http://sarin.iteye.com/blog/875915

  6. 论坛:一对一关联映射/单向关联/两个类间,可以有两个(多个)关联关系/content为大文本类型/

    >>单向:只写一端的映射属性,另一端不写(有一端用不着);双向:两端都写映射属性 >>一对一关联有两类:一类基于主键的(一般不使用),一类基于外键的(重点学习): 外键:是一个 ...

  7. PHP TP 生成二维码

    vendor('phpqrcode.phpqrcode'); $value = "http://www.baidu.com";//二维码内容 $errorCorrectionLev ...

  8. 【jdbcTemplate】baseDao书写规范

    今天加班,为了下个月的北京之行,希望父亲身体安康,一切顺利: 老大今天发出来同事的代码,并标记了jdbcTemplate的书写规范,此处查询数据库之前声明对象时,不用new出来,因为在底层源码中已经给 ...

  9. 如何使用Log4j

    如何使用Log4j? 1. Log4j是什么?   Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta. ...

  10. RNA-Seq数据去接头(Adapter)

    1.adapter是一段短的序列已知的核酸链,用于链接序列未知的目标测序片段. 2.barcode,也称为index,是一段很短的寡居核酸链,用于在多个样品混合测序时,标记不同的样品. 3.inser ...