BZOJ1787 meet
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1787
水题,但是结论很有趣。
题目求的是距离三个点之和最小的点。
这个很显然是在三个LCA上,因为可以证明除LCA的点是由LCA移动来的,这个过程中
如果在 (x,y) 移动,答案不变没有意义。
如果偏离 (x,y) 移动,答案不优。
然而有一个好玩的结论:若有两个点对 LCA 相同那么答案为另一个 LCA
画画图就可以发现,x 与 y 到另一个 LCA 的路径有重合,很显然的吧。
#include <cstdio>
#include <cstring>
#include <algorithm> #define N 500010
#define p E[i].x using namespace std; struct edge{
int x,to;
}E[N<<]; int n,m,totE,g[N],fa[N][],d[N]; inline void addedge(int x,int y){
E[++totE]=(edge){y,g[x]}; g[x]=totE;
} void dfs(int x){
for(int i=;fa[x][i-]&&i<=;i++)
fa[x][i]=fa[fa[x][i-]][i-];
for(int i=g[x];i;i=E[i].to)
if(p!=fa[x][]){
fa[p][]=x;
d[p]=d[x]+;
dfs(p);
}
} int lca(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=;~i;i--)
if(d[fa[x][i]]>=d[y]) x=fa[x][i];
if(x==y) return x;
for(int i=;~i;i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
} int dist(int a,int b){
return d[a]+d[b]-*d[lca(a,b)];
} void ask(int a,int b,int c){
int f1=lca(a,b),f2=lca(a,c),f3=lca(b,c),ans,ansv;
if(f1==f2) ans=f3;
else if(f2==f3) ans=f1;
else ans=f2;
ansv=dist(a,ans)+dist(b,ans)+dist(c,ans);
printf("%d %d\n",ans,ansv);
} int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y;i<n;i++){
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
d[]=;
dfs();
for(int i=,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
ask(x,y,z);
}
return ;
}
BZOJ1787 meet的更多相关文章
- 【BZOJ1787】[Ahoi2008]Meet 紧急集合 LCA
[BZOJ1787][Ahoi2008]Meet 紧急集合 Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 ...
- LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合
LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...
- bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...
- bzoj1787 [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2272 Solved: 1029 [Submi ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...
- 【bzoj1787】[Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2466 Solved: 1117[Submit] ...
- BZOJ1787 [Ahoi2008]Meet 紧急集合 【LCA】
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3578 Solved: 1635 [Submi ...
- 【bzoj1787】&【bzoj1832】[Ahoi2008]Meet 紧急集合 & 聚会
bzoj1787就是bzoj1832 bzoj1832 空间和时间少了一些... 求三个结点到一个结点距离之和最小的结点以及距离和 求出两两lca,其中有两个相同,答案则为另一个 感觉就是一大暴力.. ...
随机推荐
- 新建mvc项目
第一步 第二步 第三步,ok项目建好
- 【Android开发—智能家居系列】(一):智能家居原理
来到JCZB公司的第二天,就接到了开发类似于小米智能家庭APP的任务.组长让我在手机上安装上此款APP,给了我个小米智能插座,就让我开始了解需求.这便开启了我的智能家居旅程.说实话,我也真是out的无 ...
- python学习笔记——递归算法
阶乘 #递归计算阶乘 def factorial(n): if n == 1: return 1 return n*factorial(n-1) result = factorial(6) print ...
- influxDB的安装和简单使用
单机的influxdb免费,集群的是收费的 1.安装,参考官方文档 https://portal.influxdata.com/downloads RedHat & CentOS: wget ...
- mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- windows 怎么验证域名是否开启了 https
由于 ping 是针对 IP 层的,只能检查当前系统网络与网络中某个IP,某个域名是否连通. 当我们需要验证域名是否开启了 https时,用如下方法: 1. 下载tcping.exe,放到本机C盘根目 ...
- DBExecutor android 数据库框架
https://github.com/eltld/DBExecutor android 数据库框架,sqlite database
- Visual Studio自动生成文件版本信息
一. 前言 通常,要控制输出文件的版本信息,只需要手动修改资源rc文件中的Version,即可在输出文件的文件属性里查看到对应的版本信息.如下图: 但是,版本号是会随时都更新的,每次bu ...
- Serialization and deserialization are bottlenecks in parallel and distributed computing, especially in machine learning applications with large objects and large quantities of data.
Serialization and deserialization are bottlenecks in parallel and distributed computing, especially ...
- 编译spark源码 Maven 、SBT 2种方式编译
由于实际环境较为复杂,从Spark官方下载二进制安装包可能不具有相关功能或不支持指定的软件版本,这就需要我们根据实际情况编译Spark源代码,生成所需要的部署包. Spark可以通过Maven和SBT ...