题解 [BZOJ1832][AHOI2008] 聚会
解析
首先对于其中的两个点\(x,y\)最近的点显然就是他们的\(lca\)(我们把它设为\(p1\)),
然后考虑第三个点\(z\)与\(p1\)的\(lca,p2\).
有以下几种情况:
\(dep[p1]>=dep[p2]\)(也就是\(p2\)在\(p1\)上面或\(p1=p2\)),这时候答案显然就是\(p1\).
\(dep[p1]<dep[p2]\),这时候我们求出\(p3=lca(x,z),p4=lca(y,z)\)
- \(dep[p3]>dep[p4]\),这时候\(p3\)显然更优(画下图或者\(yy\)一下就能理解)
- \(dep[p4]>dep[p3]\),同理,就是反过来...
- \(p3=p4\),随便选一个...
最后用深度算距离就行啦.
code(似乎有点卡常):
#include <iostream>
#include <cstdio>
#include <cstring>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=500005;
struct edge{int to,next;}e[N<<1];
int n,m;
int head[N],cnt;
int fa[N][20],dep[N];
inline void add(int x,int y){
e[++cnt]=(edge){head[x],y};head[x]=cnt;
}
inline void dfs(int x,int f){
fa[x][0]=f;dep[x]=dep[f]+1;
for(int i=1;i<20;i++) fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;if(k==f) continue;
dfs(k,x);
}
}
inline int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=19;i>=0;i--){
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
}
if(x==y) return x;
for(int i=19;i>=0;i--){
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
}
return fa[x][0];
}
int main(){
n=read();m=read();
for(int i=1;i<n;i++){int x=read(),y=read();add(x,y);add(y,x);}
dfs(1,0);
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
int p1=lca(x,y),p2=lca(p1,z);
if(dep[p2]<dep[p1]){
printf("%d %d\n",p1,dep[x]-dep[p1]+dep[y]-dep[p1]+dep[p1]-dep[p2]+dep[z]-dep[p2]);
}
else{
int p3=lca(x,z),p4=lca(y,z);
if(dep[p3]>=dep[p4])
printf("%d %d\n",p3,dep[x]-dep[p3]+dep[z]-dep[p3]+dep[y]-dep[p1]+dep[p3]-dep[p1]);
else
printf("%d %d\n",p4,dep[y]-dep[p4]+dep[z]-dep[p4]+dep[x]-dep[p1]+dep[p4]-dep[p1]);
}
}
return 0;
}
题解 [BZOJ1832][AHOI2008] 聚会的更多相关文章
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- bzoj1832: [AHOI2008]聚会--LCA
本来觉得这是一道挺水的题目,后来觉得出题人挺变态的= = 半个小时敲完后,内存超限它给我看TLE,还是0ms,后来才发现内存限制64m 然后卡了一个小时后AC了.. 题目大意是在一棵树上找三点的最短路 ...
- BZOJ 1832: [AHOI2008]聚会( LCA )
LCA模板题...不难发现一定是在某2个人的LCA处集合是最优的, 然后就3个LCA取个最小值就OK了. 距离就用深度去减一减就可以了. 时间复杂度O(N+MlogN) (树链剖分) -------- ...
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1841 Solved: 857[Submit][ ...
- 【BZOJ】1832: [AHOI2008]聚会
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...
- bzoj 1832: [AHOI2008]聚会
良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...
- 【简】题解 AWSL090429 【聚会】
这题直接换根dp 记录在要转移的点的子树中有多少牛 #include<bits/stdc++.h> using namespace std; #define ll long long #d ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
随机推荐
- chrome 监听touch类事件报错:无法被动侦听事件preventDefault
先上错误信息: Unable to preventDefault inside passive event listener due to target being treated as passiv ...
- 更新neo4j节点信息
将多个属性的内容更新到节点上 def update_by_id(id,graph,**kwargs): """ 更新节点的属性 根据节点的ID来更新节点的属性,如果存在该 ...
- Ubuntu18突然卡死解决方法
emmmm 1.Ctrl+Alt+F2/F3/F4/F5/F6 F2-6随便选一个都可以 2.进入tty终端后先输入用户名和密码(记得小键盘会自动
- (四)mybatis 的主键返回
目录 文章目录 自增主键(LAST_INSERT_ID()) 非自增主键(UUID() ) 自增主键(LAST_INSERT_ID()) 在映射关系文件中配置 <!--插入用户--> &l ...
- Codeforces Round #590 (Div. 3) Editorial
Codeforces Round #590 (Div. 3) Editorial 题目链接 官方题解 不要因为走得太远,就忘记为什么出发! Problem A 题目大意:商店有n件商品,每件商品有不同 ...
- LC 599. Minimum Index Sum of Two Lists
题目描述 Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of fav ...
- PHP身份证验证
/** * 身份证号码验证(真正要调用的方法) * @param $id_card 身份证号码 */function validation_filter_id_card($id_card){ if ( ...
- 一、python快速入门(每个知识点后包含练习)
1. 编程与编程语言 编程的目的是什么? #计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一 ...
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- Spring MVC <context:annotation-config> 与 <context:component-scan>
在MVC的配置文件中,二者常出现,功能相似.简单做个比较 <context:annotation-config> 用于激活应用上下文中已经注册的bean的注解,无论你的bean是通过什么方 ...