博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1787】[Ahoi2008]Meet 紧急集合 倍增LCA
阅读量:4973 次
发布时间:2019-06-12

本文共 1731 字,大约阅读时间需要 5 分钟。

题目描述

输入

输出

样例输入

6 4

1 2
2 3
2 4
4 5
5 6
4 5 6
6 3 1
2 4 4
6 6 6

样例输出

5 2

2 5
4 1
6 0


题解

倍增LCA

首先有集合点必定在三点中两个点的LCA处,大概画一下就看出来了。

然后有x到y的距离为deep[x]+deep[y]-2*deep[lcaxy]

那么x、y、z三点到lcaxy的距离为deep[x]+deep[y]-2*deep[lcaxy]+deep[lcaxy]+deep[x]-deep[lcaxyz]

到lcaxz、lcayz同理。

可以看出集合点的选择只和deep[lca]有关,于是求一下最大值,再减掉就好了。

#include 
#include
using namespace std;int head[500010] , to[1000010] , next[1000010] , cnt , log[500010] , fa[500010][21] , deep[500010];void add(int x , int y){ to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;}void dfs(int x){ int i; for(i = 1 ; i <= log[deep[x]] ; i ++ ) fa[x][i] = fa[fa[x][i - 1]][i - 1]; for(i = head[x] ; i ; i = next[i]) if(to[i] != fa[x][0]) fa[to[i]][0] = x , deep[to[i]] = deep[x] + 1 , dfs(to[i]);}int getlca(int x , int y){ int i; if(deep[x] < deep[y]) swap(x , y); for(i = log[deep[x] - deep[y]] ; ~i ; i -- ) if(deep[x] - (1 << i) >= deep[y]) x = fa[x][i]; if(x == y) return x; for(i = log[deep[x]] ; ~i ; i -- ) if(fa[x][i] != fa[y][i]) x = fa[x][i] , y = fa[y][i]; return fa[x][0];}int main(){ int n , m , i , x , y , z , xy , xz , yz , t; scanf("%d%d" , &n , &m); for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x); for(i = 2 ; i <= n ; i ++ ) log[i] = log[i >> 1] + 1; dfs(1); while(m -- ) { scanf("%d%d%d" , &x , &y , &z); xy = getlca(x , y) , xz = getlca(x , z) , yz = getlca(y , z) , t = deep[x] + deep[y] + deep[z] - 2 * deep[getlca(xy , z)]; if(deep[xy] > deep[xz] && deep[xy] > deep[yz]) printf("%d %d\n" , xy , t - deep[xy]); else if(deep[xz] > deep[yz]) printf("%d %d\n" , xz , t - deep[xz]); else printf("%d %d\n" , yz , t - deep[yz]); } return 0;}

 

转载于:https://www.cnblogs.com/GXZlegend/p/6626192.html

你可能感兴趣的文章
清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
查看>>
POJ 1840 Eqs HASH
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
BZOJ 1833: [ZJOI2010]count 数字计数( dp )
查看>>
关于toString()和String()要说几句话
查看>>
bzoj 3751[NOIP2014]解方程
查看>>
CSS(二) 文字样式属性,背景和列表
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
面试题三 替换空格
查看>>
LeetCode104.二叉树最大深度
查看>>
linux usb驱动——Gadget代码介绍
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>
使用 ref 和 out 传递数组注意事项
查看>>
纵越6省1市-重新启动
查看>>
hive安装以及hive on spark
查看>>