ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树链剖分求lca

2022-02-05 18:02:31  阅读:110  来源: 互联网

标签:int 剖分求 树链 depth maxn lca path include Size


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

输入

第一行一个整数N.接下来N 个数,第i 个数Fi 表示i 的父亲是Fi. 若Fi = 0,则i 为树根.
接下来一个整数M.接下来M 行,每行2 个整数A、B,询问节点(A xor LastAns)、(Bxor LastAns)的最近公共祖先. 其中LastAns 为上一个询问的答案,一开始LastAns = 0.
输出
对每一个询问输出相应的答案.

样例输入
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
样例输出
3
1
4
5
2
4
2
5
2
5

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 5e5 + 5;
vector<int>map[maxn];
int vis[maxn];
int fa[maxn];
int Size[maxn];
int Mainson[maxn];
int depth[maxn];
int root;

void DFS1(int v)
{
	vis[v] = 1; Size[v] = 1;
	for (int i = 0; i < map[v].size(); i++) {
		int u = map[v][i];
		if (!vis[u]) {
			fa[u] = v;
			depth[u] = depth[v] + 1;
			DFS1(u);
			Size[v] += Size[u];
			if (Size[u] > Size[Mainson[v]])Mainson[v] = u;
		}
	}
}

int path[maxn];
void DFS2(int u)
{
	vis[u] = 1;
	for (int i = 0; i < map[u].size(); i++) {
		int v = map[u][i];
		if (!vis[v]) {
			if (v == Mainson[u])path[v] = path[u];
			else path[v] = v;
			DFS2(v);
		}
	}
}

int lca(int a, int b)
{
	while (path[a] != path[b]) {
		if (depth[path[a]] > depth[path[b]])a = fa[path[a]];
		else b = fa[path[b]];
	}
	return depth[a] < depth[b] ? a : b;
}
int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		int a; scanf("%d", &a);
		if (a == 0)root = i;
		else {
			map[i].push_back(a); map[a].push_back(i);
		}
	}
	memset(vis, 0, sizeof(vis)); depth[root] = 0;
	DFS1(root);
	memset(vis, 0, sizeof(vis)); path[root] = root;
	DFS2(root);
	int m;scanf("%d", &m);
	int lastans = 0;
	//for (int i = 1; i <= n; i++)printf("%d\n", depth[i]);
	for (int i = 1; i <= m; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		int ans = lca(a ^ lastans, b ^ lastans);
		printf("%d\n", ans);
		lastans = ans;
	}
}

标签:int,剖分求,树链,depth,maxn,lca,path,include,Size
来源: https://www.cnblogs.com/tzp-empty-hya/p/15864512.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有