题目: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的更多相关文章

  1. 【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 ...

  2. LCA 【bzoj1787】[Ahoi2008]Meet 紧急集合

    LCA [bzoj1787][Ahoi2008]Meet 紧急集合 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1787 注意到边权为一 ...

  3. bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会

    bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...

  4. bzoj1787 [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2272  Solved: 1029 [Submi ...

  5. 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2259  Solved: 1023[Submit] ...

  6. BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树.接下来m次询问(m≤500000),每次 ...

  7. 【bzoj1787】[Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2466  Solved: 1117[Submit] ...

  8. BZOJ1787 [Ahoi2008]Meet 紧急集合 【LCA】

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3578  Solved: 1635 [Submi ...

  9. 【bzoj1787】&【bzoj1832】[Ahoi2008]Meet 紧急集合 & 聚会

    bzoj1787就是bzoj1832 bzoj1832 空间和时间少了一些... 求三个结点到一个结点距离之和最小的结点以及距离和 求出两两lca,其中有两个相同,答案则为另一个 感觉就是一大暴力.. ...

随机推荐

  1. uibutton去掉点击后背景有阴影的方法

    1,将normal和highlight两种方式都设置上图片即可 UIButton *goback = [[UIButton alloc]initWithFrame:CGRectMake(5.0f, 5 ...

  2. 普元OA平台介绍

    Primeton Portal提供了访问企业信息资源的统一入口,是一个面向企业的内容管理.信息发布和集成展现平台,提供了单点登录.内容管理.信息发布.应用集成.个性化等功能,能够帮助企业快速搭建一个集 ...

  3. BUPT复试专题—二进制数(2012)

    https://www.nowcoder.com/practice/103dd589fed14457a673c613d8de3841?tpId=67&tqId=29634&tPage= ...

  4. 转: DNS 原理入门 (from 阮一峰)

    转自:http://www.ruanyifeng.com/blog/2016/06/dns.html DNS 原理入门   作者: 阮一峰 日期: 2016年6月16日 DNS 是互联网核心协议之一. ...

  5. Thinking in React(翻译)

    下面是React官方文档中的Thinking inReact文章的翻译,第一次翻译英文的文章,肯定有非常多不对的地方,还望多多包涵. 原文地址:https://facebook.github.io/r ...

  6. weexapp 开发流程(二)框架搭建

    1.创建 入口文件 src / entry.js /** * 入口文件 */ import App from './App.vue' import router from './router' // ...

  7. 一句话说清楚啥是delegate

    所谓托付就是类对象调用.托付对象代表随意实现该托付的类的对象.

  8. IntelliTrace窗口无法弹出的解决办法

    最近在使用EF框架,所以需要IntelliTrace窗口进行对ADO的SQL生成监控.可找了半天都无法Call出该窗口. 在Debug模式下,选择调试->窗口 里面根本没有IntelliTrac ...

  9. nextSibling和previousSibling

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. oracle SQL语句(转)

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...