当两个点在一条链上,它们的LCA就是深度较小的那个点。

于是这种树链剖分写LCA的思想就是把要求的两个点想办法靠到一条链上。

而且要靠到尽量更优的一条链上(重链)。

做法:

预处理出每棵树上的重链(size大的),每个点求出一个top,代表与这个点能靠到最近的一条重链的位置。

求LCA时两个点分别向各自top移动,直到两个点到一条链上,输出深度较小的

细节见代码

#include<cstdio>
#include<iostream>
#define MAXN 500001
using namespace std;
struct edge{int pre,other;}b[MAXN*];
struct node{int last,p,depth,h,child,top;}a[MAXN];
int cnt,N,M,x,y,l,root;
void connect(int x1,int x2)
{
b[++cnt]=(edge){a[x1].last,x2};
a[x1].last=cnt;
}
void dfs1(int x1)                  //第一次dfs预处理size、深度,求出重链 (变量名错了 h就是size)
{
a[x1].depth=a[a[x1].p].depth+;
a[x1].h=;
for(int i=a[x1].last;i;i=b[i].pre)
{
int x2=b[i].other;
if(!a[x2].p&&a[x1].p!=x2)
{
a[x2].p=x1;
dfs1(x2);
a[x1].h+=a[x2].h;
if(a[a[x1].child].h<a[x2].h)a[x1].child=x2;
}
}
}
void dfs2(int x1)                 //第二次dfs预处理top
{ 
if(x1==a[a[x1].p].child)a[x1].top=a[a[x1].p].top;            
else a[x1].top=x1;
for(int i=a[x1].last;i;i=b[i].pre)if(a[b[i].other].p==x1)dfs2(b[i].other);
}
int LCA(int x1,int x2)
{
while(a[x1].top!=a[x2].top)          
{
if(a[a[x1].top].depth>a[a[x2].top].depth)x1=a[a[x1].top].p;
else x2=a[a[x2].top].p;          //深度大的点向top移动
}
return a[x1].depth<a[x2].depth?x1:x2;
}
int main()
{
scanf("%d%d%d",&N,&M,&root);
for(int i=;i<=N-;i++)
{
scanf("%d%d",&x,&y);
connect(x,y);
connect(y,x);
}
dfs1(root);
dfs2(root);
while(M--)
{
scanf("%d%d",&x,&y);
printf("%d\n",LCA(x,y));
}
return ;
}

用树链剖分来写LCA的更多相关文章

  1. 树链剖分 (求LCA,第K祖先,轻重链剖分、长链剖分)

      2020/4/30   15:55 树链剖分是一种十分实用的树的方法,用来处理LCA等祖先问题,以及对一棵树上的节点进行批量修改.权值和查询等有奇效. So, what is 树链剖分? 可以简单 ...

  2. 树链剖分(附带LCA和换根)——基于dfs序的树上优化

    .... 有点懒: 需要先理解几个概念: 1. LCA 2. 线段树(熟练,要不代码能调一天) 3. 图论的基本知识(dfs序的性质) 这大概就好了: 定义: 1.重儿子:一个点所连点树size最大的 ...

  3. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  4. 数据结构--树链剖分准备之LCA

    有关LCA的模板题    传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...

  5. P3379 【模板】最近公共祖先(LCA)(树链剖分)版

    #include <bits/stdc++.h> #define read read() #define up(i,l,r) for(register int i = (l);i < ...

  6. LCA树链剖分

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

  7. 浅谈树链剖分 F&Q

    这是一篇迟来的博客,由于我懒得写文章,本篇以两个问题阐述笔者对树链剖分的初步理解. Q1:树链剖分解决什么问题? 树链剖分,就是把一棵树剖分成若干连续的链,将这些链里的数据映射在线性数组上维护.比方说 ...

  8. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  9. 【BZOJ4538】【HNOI2016】网络(树链剖分,线段树,堆)

    题目链接,我是真的懒得调题目的格式... 题解 树链剖分搞一下LCA 把线段树弄出来 这只是形式上的线段树 本质上是维护一段区间的一个堆 每次把堆插入节点, 询问的时候查询线段树上的堆的最大值就行了 ...

随机推荐

  1. vue项目中设置全局引入scss,使每个组件都可以使用变量

    在Vue项目中使用scss,如果写了一套完整的有变量的scss文件.那么就需要全局引入,这样在每个组件中使用. 可以在mian.js全局引入,下面是使用方法. 1: 安装node-sass.sass- ...

  2. 新疆大学OJ(ACM) 1099: 数列有序!

    1099: 数列有序! 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的 ...

  3. .startsWith和endsWith的使用方法与说明

    a.startsWith(b) --判断字符串a,是不是以字符串b开头 a.endsWith(b) --判断字符串a,是不是以字符串b结尾

  4. linux VNC-server

    [root@kvm-server Packages]# rpm -qpi tigervnc-server-1.8.0-1.el7.x86_64.rpm Name : tigervnc-server V ...

  5. 关于数组array_diff(array1, array2)求差集来比较数组是否相等的问题细究

    无意中发现很多朋友都喜欢使用array_diff(array1, array2)来判断两个数组是否相等, 我自己也偶尔会这么使用 但是今天我在写代码的过程中无意发现这么做是不准确的. 首先我们来看一下 ...

  6. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  7. hadoop-06-http服务

    hadoop-06-http服务 su root service httpd status service httpd stop vi /etc/httpd/conf/httpd.conf 修改:Do ...

  8. Caused by: java.lang.ClassNotFoundException: com.njupt.libgdxbase.MainActivity

    在使用libgdx来开发游戏时.假设遇到这样的问题.非常可能是由于你没有在libgdx的项目中导入Android的现骨干jar包导致的. 解决方法例如以下: 右击项目---"build pa ...

  9. BNUOJ34980方(芳)格(哥)取数(好坑)

    方(芳)格(哥)取数 Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class n ...

  10. 走进windows编程的世界-----消息处理函数(2)

    一 WM_PAINT消息 1 WM_PAINT的产生   因为窗体的互相覆盖等,产生须要绘制的区域,那么会产生WM_PAINT消息.   普通情况下,不直接发送WM_PAINT消息,通过API声明须要 ...