倍增 - 强制在线的LCA
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的更多相关文章
- [EOJ439] 强制在线
Description 见EOJ439 Solution 先考虑不强制在线怎么做. 按询问区间右端点排序,从左往右扫,维护所有后缀的答案. 如果扫到 \(a[i]\),那么让统计个数的 \(cnt[a ...
- hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)
链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...
- 洛谷 P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 题目背景 曦月最近学会了快速排序,但是她很快地想到了,如果要动态地排序,那要怎么办呢? 题目描述 为了研究这个问题,曦月提出了一个十分简单的问题 曦月希望维护一个 ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- luoguP5105 不强制在线的动态快速排序
emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...
- [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔 http://blog.csdn.net/jiangyuze831/article/de ...
- 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 ...
- P5105 不强制在线的动态快速排序
P5105 不强制在线的动态快速排序 $\bigoplus \limits_{i=2}^n (a_i^2-a_{i-1}^2) = \bigoplus \limits_{i=2}^n (a_i-a_{ ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
随机推荐
- HTML5&CSS挑战
地址:https://www.w3cschool.cn/codecamp/list?pename=html5_and_css_camp 开始学习HTML标签:欢迎来到编程训练营的第一个编程挑战!你可以 ...
- 使用create react app教程
This project was bootstrapped with Create React App. Below you will find some information on how to ...
- 使用startForeground让android服务前台运行
最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForegroun ...
- scanner/portscan/syn
msf > use auxiliary/scanner/portscan/syn msf auxiliary(syn) > set RHOSTS 172.16.21.170 /*设定rh ...
- 时序js插件cubism使用
document http://iwantmyreal.name/blog/2012/09/16/visualising-conair-data-with-cubism-dot-js https:// ...
- php:生成的时间与本地电脑的时间不匹配
如题,在php中我发现在数据库中的时间跟电脑上的时间没有同步 本地时间: 数据库中,生成的时间: 很明显,时分秒是对应不上去的,那么我们只要在php.ini中找到 这里被注释掉了,那我们就改成这样: ...
- java Vamei快速教程05 实施接口
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...
- Python实现注册和登录
一.注册账号需要实现的功能 1.输入:用户名,密码,密码确认 2.限制1:输入的账号和密码不能为空 3.限制2:两次输入密码必须一致 4.限制3:用户名不能重复 5.限制4:错误次数为4次 6.用字典 ...
- javaweb基础(32)_jdbc学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
- js常见问题总结归纳
一.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱? 首先typeof bar === "object ...