题目大意:

一棵树上,两个相邻点之间距离为1,每次询问三个点,

求到这三个点距离和最小的点,以及这个距离和

思路:

几乎是lca裸题

lca:倍增即可

然后求出每两个点之间的lca

画画图可知必有两个lca相等

而此时答案即为另一个lca

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<set>
 8 #include<map>
 9 #include<vector>
10 #include<stack>
11 #include<queue>
12 #define ll long long
13 #define inf 2147383611
14 #define MAXN 1000101
15 using namespace std;
16 inline ll read()
17 {
18     ll x=0,f=1;
19     char ch;ch=getchar();
20     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
21     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
22     return x*f;
23 }
24 int cnt,n,T,to[MAXN],first[MAXN],next[MAXN];
25 int depth[MAXN];
26 int f[MAXN][28];
27 void add(int u,int v) {next[++cnt]=first[u],first[u]=cnt,to[cnt]=v;}
28 void dfs(int x,int fa)
29 {
30     for(int i=1;i<=25;i++)
31     {
32         if((1<<i)>=depth[x]) break;
33         f[x][i]=f[f[x][i-1]][i-1];
34     }
35     for(int i=first[x];i;i=next[i]) if(to[i]!=fa) {depth[to[i]]=depth[x]+1;f[to[i]][0]=x;dfs(to[i],x);}
36 }
37 int lca(int u,int v)
38 {
39     if(depth[u]<depth[v]) swap(u,v);
40     int d=depth[u]-depth[v];
41     for(int i=25;i>=0;i--)
42         if(d&(1<<i)) u=f[u][i];
43     for(int i=25;i>=0;i--)
44     {
45         if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
46     }
47     if(u==v) return v;
48     return f[u][0];
49 }
50 int main()
51 {
52     n=read(),T=read();
53     int a,b,c,l1,l2,l3;
54     for(int i=1;i<n;i++) {a=read(),b=read();add(a,b);add(b,a);}
55     depth[1]=1;dfs(1,0);
56     while(T--)
57     {
58         a=read(),b=read(),c=read();
59         l1=lca(a,b),l2=lca(a,c),l3=lca(b,c);
60         if(l1==l2) printf("%d %d\n",l3,depth[b]+depth[c]-depth[l3]*2+depth[a]-depth[l1]+depth[l3]-depth[l1]);
61         else if(l1==l3) printf("%d %d\n",l2,depth[a]+depth[c]-depth[l2]*2+depth[b]-depth[l1]+depth[l2]-depth[l1]);
62         else if(l2==l3) printf("%d %d\n",l1,depth[a]+depth[b]-depth[l1]*2+depth[c]-depth[l2]+depth[l1]-depth[l2]);
63     }
64 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/7602729.html

bzoj 1787 紧急集合相关推荐

  1. BZOJ 1787: [Ahoi2008]Meet 紧急集合

    BZOJ 1787: [Ahoi2008]Meet 紧急集合 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都 ...

  2. BZOJ 1787 [Ahoi2008]Meet紧急集合 题解与分析

    [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec   Memory Limit: 162 MB Description Input Output Sample Input ...

  3. BZOJ 1787 [Ahoi2008]Meet 紧急集合——LCA

    1787: [Ahoi2008]Meet 紧急集合 题目传送门 解题思路 本题是裸的LCA,特殊就在是三个点的LCA,然而并没有什么关系. 三个节点两两求LCA,将会有两个一样的公共祖先,剩下的一个就 ...

  4. bzoj 1787 bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)

    1832: [AHOI2008]聚会 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1539  Solved: 663 [Submit][Status ...

  5. BZOJ 1787 AHOI2008 紧急集合 倍增LCA

    题目大意:给定一棵树,多次询问到三个点距离之和最小的点和距离 首先易知到两个点距离之和最小的点一定在两点间的路径上 于是到三个点距离之和最小的点一定在两两之间路径的交点上 然后很容易就会知道这个交点一 ...

  6. 关于轻重边及树链剖分该怎么写...

    AC BZOJ 1787 轻重边剖分LCA 1 #include <cstdio> 2 #include <fstream> 3 #include <iostream&g ...

  7. 1787: [Ahoi2008]Meet 紧急集合

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

  8. BZOJ [Ahoi2008]Meet 紧急集合

    Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Sample Output ...

  9. [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB http://www.lydsy.com/JudgeOnline/ ...

最新文章

  1. 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
  2. python全栈-Day 14
  3. 搭建第一个SpringBoot工程;SpringBoot整合mybatis;SpringBoot整合Redis-cluster集群;SpringBoot整合EhCache;
  4. python怎么画波浪_python 实现波浪滤镜特效
  5. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程
  6. Oracle入门(十四.13)之带参数的游标
  7. 中年发福谁之“过”?Science论文采用“双标水”法首次揭示全生命周期代谢规律...
  8. 使用Newtonsoft.Json接受部分资源
  9. LeetCode 662. Maximum Width of Binary Tree
  10. 4059. 统计某指定字符出现个数
  11. 软考软件设计师下午题目java设计模式(自用)
  12. Spark学习笔记(一)
  13. 【贪玩巴斯】传感器与检测技术 (一)「金属传感器三大重要传感器——电感、电容与振弦式」2021-09-28
  14. 量化投资学习——股指期货研究(八)
  15. 解决无法看到eth0的简单情况
  16. Strurts(四)——从Struts原型模拟看大道至简(含实例下载)
  17. android 音频切换分析,Android音频可视化操作
  18. 【分享】“飞书自建“在集简云平台集成应用的常见问题与解决方案
  19. 安卓系统无线投屏到win10
  20. 常见字母组合发音规律

热门文章

  1. 大量LAST_ACK 的分析过程
  2. android interview 1
  3. 设置datagridview的数据源为(DATASET)SQL查寻结果
  4. python添加数组元素_Python列表附录–如何向数组添加元素,并附带示例说明
  5. mysql 主从复制 和基于gtid的mysql主从复制
  6. android 模板方法模式,安卓设计模式(七)模板方法模式
  7. java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
  8. 什么样的人适合学习UI?
  9. 七牛云内容审核服务被选为「上海首批人工智能创新产品」
  10. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现