P4281 [AHOI2008]紧急集合 / 聚会
lca
题意:求3个点的lca,以及3个点与lca的距离之和。
性质:设点q1,q2,q3
两点之间的lca
t1=lca(q1,q2)
t2=lca(q1,q3)
t3=lca(q2,q3)
一定有两个lca重合
3个点的公共lca一定在 两个lca之间(有重合)
而重合的lca深度必定更浅
所以3个点的公共lca就是那个不重合的lca
(完整证明还是看题解吧TAT)
使用倍增法(懒得打树剖了qwq)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
template <typename T> inline void output(T x){
if(!x) {putchar(); return ;}
int wt[],l=;
while(x) wt[++l]=x%,x/=;
while(l) putchar(wt[l--]+);
}
int n,m,ans,fa[][],d[];
int cnt,hd[],nxt[],ed[],poi[]; //注意边开2倍
inline void add(int x,int y){
nxt[ed[x]]=++cnt; hd[x]= hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
inline void dfs(int x,int _fa){
d[x]=d[_fa]+; fa[][x]=_fa;
for(int i=;(<<i)<=d[x];++i) fa[i][x]=fa[i-][fa[i-][x]];
for(int i=hd[x];i;i=nxt[i]) if(poi[i]!=_fa) dfs(poi[i],x);
}
inline int lca(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=;i>=;--i) if(d[fa[i][x]]>=d[y]) x=fa[i][x];
if(x==y) return x;
for(int i=;i>=;--i) if(fa[i][x]!=fa[i][y]) x=fa[i][x],y=fa[i][y];
return fa[][x];
}
//----------lca模板---------
int main(){
read(n); read(m); int q1,q2,q3;
for(int i=;i<n;++i) read(q1),read(q2),add(q1,q2),add(q2,q1);
dfs(,);
for(int i=;i<=m;++i){
read(q1),read(q2),read(q3); ans=;
int t1=lca(q1,q2);
int t2=lca(q1,q3);
int t3=lca(q2,q3);
if(t1==t2) ans=t3;
else if(t1==t3) ans=t2;
else if(t2==t3) ans=t1; //找到不同的那个lca
output(ans),putchar(' ');
output(d[q1]+d[q2]+d[q3]-d[t1]-d[t2]-d[t3]),putchar('\n');
}return ;
}
P4281 [AHOI2008]紧急集合 / 聚会的更多相关文章
- P4281 [AHOI2008]紧急集合 / 聚会[LCA]
解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...
- LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream> ...
- [AHOI2008]紧急集合 / 聚会(LCA)
[AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通 ...
- LCA【p4281】[AHOI2008]紧急集合 / 聚会
Description 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等 ...
- [AHOI2008]紧急集合 / 聚会
题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...
- 【题解】洛谷P4281 [AHOI2008] 紧急集合(求三个点LCA)
洛谷P4281:https://www.luogu.org/problemnew/show/P4281 思路 答案所在的点必定是三个人所在点之间路径上的一点 本蒟蒻一开始的想法是:先求出2个点之间的L ...
- Luogu 4281 [AHOI2008]紧急集合 / 聚会
BZOJ 1832 写起来很放松的题. 首先发现三个点在树上一共只有$3$种形态,大概长这样: 这种情况下显然走到三个点的$lca$最优. 这种情况下走到中间那个点最优. 这种情况下走到$2$最优. ...
- 洛谷 P4281 [AHOI2008] 紧急集合 题解
挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解.值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为 ...
- 「AHOI2008」「LuoguP4281」紧急集合 / 聚会(LCA
题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...
随机推荐
- HOJ 2156 &POJ 2978 Colored stones(线性动规)
Colored stones Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1759 Accepted: 829 Descrip ...
- ubuntu下opencv2.4.9和opencv3.1.0的共存
转载:ubuntu下opencv2.4.9和opencv3.1.0的共存 关于opencv3.1.0和opencv2.4.9的共存问题其实并不是什么大的问题,因此网上资料比较少.本人也是因为在安装Ro ...
- mount --bind 的妙用
在固件开发过程中常常遇到这样的情况:为测试某个新功能,必需修改某个系统文件.而这个文件在只读文件系统上(总不能为一个小小的测试就重刷固件吧),或者是虽然文件可写,但是自己对这个改动没有把握,不愿意 ...
- Docker基本命令与使用 —— Dockerfile指令与构建(三)
一.Dockerfile指令上 1.指令格式 # Comment 注释, 以#开头 INSTRUCTION argument 以大写的指令+参数 #First Dockerfile 注释 FROM u ...
- 学习计划 nginx 中 mime.types 的作用
nginx中http模块下默认配置加载了mime.type 于是想知道这是什么? -- 什么是mime.type? 首先,应该了解到,浏览器是如何处理内容的,在浏览器中显示的各种内容,MP4.png. ...
- 代码这样写更优雅(Python版)
要写出 Pythonic(优雅的.地道的.整洁的)代码,还要平时多观察那些大牛代码,Github 上有很多非常优秀的源代码值得阅读,比如:requests.flask.tornado,笔者列举一些常见 ...
- 常用python包(依赖)Ubuntu下
amqp==1.4.9anyjson==0.3.3apturl==0.5.2beautifulsoup4==4.4.1billiard==3.3.0.23blinker==1.3Brlapi==0.6 ...
- html 1:1比例显示
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...
- python 基础 特殊符号的使用
python语句中的一些基本规则和特殊符号: 1.井号# 表示之后的字符为python注释 Python注释语句从#号字符开始,注释可以在语句的任何一个地方开始,解释器会忽略掉该行#号之后的所有内容 ...
- Linux发展历史图
Linux发展历史图 http://futurist.se/gldt/wp-content/uploads/12.10/gldt1210.svg