LCA

描述

给一棵有根树,以及一些询问,每次询问树上的 2 个节点 A、B,求它们的最近公共祖先.

!强制在线!

输入

第一行一个整数 N.

接下来 N 个数,第 i 个数 F i 表示 i 的父亲是 F i. 若 F i = 0,则 i 为树根.

接下来一个整数 M.

接下来 M 行,每行 2 个整数 A、B,询问节点(A xor LastAns)、(Bxor LastAns)的最近公共祖先. 其中 LastAns 为上一个询问的答案,一开始 LastAns = 0.

输出

对每一个询问输出相应的答案.

样例

Sample Input
10
0 1 2 3 2 4 2 5 4 9
10
3 9
2 7
7 8
1 1
0 6
6 11
6 3
10 7
2 15
7 7
Sample Output
3
1
4
5
2
4
2
5
2
5

提示

30%,n,m≤1000

100% n,m≤100,000


既然名字都叫LCA了那当然是求LCA啦然而某些题……

鬼知道是怎么强制在线的。

不管那么多,在线的LCA有2种求法:转换成RMQ,或者倍增跳跳跳。

由于只会倍增的原因在这里选择倍增。

关键操作主要有DFS和lca。

DFS预处理出每个点的深度和倍增数组,

lca中首先让深度最大的点向上跳直到与另一个点平齐,

如果不同的话2个点一起肛肛到你听到为止用倍增数组跳,跳到相等为止。

代码实现算是简单的

代码蒯上

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int _a=0;bool _b=1;register char _c=getchar();
while(_c<'0' || _c>'9'){if(_c=='-')_b=0;_c=getchar();}
while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
return _b?_a:-_a;
}
const int _ = 100002;
struct edge{int to,ne;edge(){to=ne=0;}}e[_*2];
int he[_]={0},ecnt=0;
void add(int fr,int to)
{e[++ecnt].to=to,e[ecnt].ne=he[fr],he[fr]=ecnt;}
int fa[_][20],dep[_],n;
bool ed[_]={0};
void DFS(int d)
{
ed[d]=1;
int i,j;
for(i=1;i<=18;i++)if(dep[d]>=(1<<i))fa[d][i]=fa[fa[d][i-1]][i-1];
for(i=he[d];i;i=e[i].ne)
if(!ed[j=e[i].to])fa[j][0]=d,dep[j]=dep[d]+1,DFS(j);
}
int finder(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
int i,cha=dep[a]-dep[b];
for(i=0;i<=18;i++)
{
if(cha & (1<<i))a=fa[a][i];
if(a==b)return a;
}
for(i=18;i>=0;i--)if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
return fa[a][0];
}
int main()
{
register int i,j,t,la=0;
n=gotcha();
for(i=1;i<=n;i++)j=gotcha(),add(i,j),add(j,i);
for(i=1;i<=n;i++)if(!ed[i])DFS(i);
t=gotcha();
while(t--)
{
i=gotcha() xor la,j=gotcha() xor la;
la=finder(i,j),printf("%d\n",la);
}
return 0;
}

倍增 - 强制在线的LCA的更多相关文章

  1. [EOJ439] 强制在线

    Description 见EOJ439 Solution 先考虑不强制在线怎么做. 按询问区间右端点排序,从左往右扫,维护所有后缀的答案. 如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a ...

  2. hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)

    链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...

  3. 洛谷 P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 题目背景 曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢? 题目描述 为了研究这个问题,曦月提出了一个十分简单的问题 曦月希望维护一个 ...

  4. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  5. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  6. [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树

    jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔   http://blog.csdn.net/jiangyuze831/article/de ...

  7. SPOJ 10628 Count on a tree(Tarjan离线 | RMQ-ST在线求LCA+主席树求树上第K小)

    COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to  ...

  8. P5105 不强制在线的动态快速排序

    P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...

  9. POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)

    1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

随机推荐

  1. AGC015 C Nuske vs Phantom Thnook(前缀和)

    题意 题目链接 给出一张$n \times m$的网格,其中$1$为蓝点,$2$为白点. $Q$次询问,每次询问一个子矩阵内蓝点形成的联通块的数量 保证任意联通块内的任意蓝点之间均只有一条路径可达 S ...

  2. Consider everything deeply but still remain fearless.

    Consider everything deeply but still remain fearless.愿你能深思熟虑,但始终无所畏惧.

  3. CAS登录认证的简单介绍

    参考博客:  https://www.jianshu.com/p/8daeb20abb84 下面是CAS最基本的协议过程: 下面是CAS Web工作流程图: 名词解释 Ticket Grangting ...

  4. iOS 点击左上角系统返回按钮方法

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endBackground) name:UIAppl ...

  5. Check-Point-Security-Gateway-BYOL-R77.30-041.161

    平台: CentOS 类型: 虚拟机镜像 软件包: checkpoint redhat smartconsole basic software security vfw 服务优惠价: 按服务商许可协议 ...

  6. 使用adbWireless无线调试Android真机设备[转]

    开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试.长长的USB线显得很麻烦,而且如果需要USB接口与其他设备连接的话显得很不方便.今天介绍一种不通过U ...

  7. hdu-3790 最短路径问题---dijkstra两重权值

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到 ...

  8. 深入理解计算机系统_3e 第十章家庭作业 CS:APP3e chapter 10 homework

    10.6 1.若成功打开"foo.txt": -->1.1若成功打开"baz.txt": 输出"4\n" -->1.2若未能成功 ...

  9. ThreadLocal为什么要用WeakReference

    先上一张图看一下ThreadLocal的内部结构,每个Thread对象内部都维护了一个ThreadLocal.ThreadLocalMap 我们在上图看到的就是三个Thread对象内部格子的Threa ...

  10. AngularJs学习笔记-服务

    服务 (1)在模块中声明的服务对所有组件可见 (2)在组件中声明的服务对自己本身和其子组件 (3)在组件中声明的服务会覆盖在模块中声明的服务 (4)通过@Injectable()装饰器可以在服务中注入 ...