题目大意:给定一棵树,多次询问到三个点距离之和最小的点和距离

首先易知到两个点距离之和最小的点一定在两点间的路径上

于是到三个点距离之和最小的点一定在两两之间路径的交点上

然后很容易就会知道这个交点一定是其中两个点的LCA(其实是我不会证)

此外为什么不会是三个点共同的LCA呢?因为三个点共同的LCA一定是至少一对点的LCA 证明略(其实我也不会证)

然后就是枚举两两之间的LCA 求一下距离 取最小即可

然后就是倍增LCA的问题了 我的倍增LCA怎么又挂了 还能不能写对了0.0

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 500500
using namespace std;
struct abcd{int to,next;
}table[M<<1];
int head[M],tot;
int n,m,ans,anspoint;
int dpt[M],fa[M][20];
void Add(int x,int y)
{table[++tot].to=y;table[tot].next=head[x];head[x]=tot;
}
void DFS(int x)
{int i;dpt[x]=dpt[fa[x][0]]+1;for(i=head[x];i;i=table[i].next){if(table[i].to==fa[x][0])continue;fa[table[i].to][0]=x;DFS(table[i].to);}
}
int LCA(int x,int y)
{int j;if(dpt[x]<dpt[y])swap(x,y);for(j=19;~j;j--)if(dpt[fa[x][j]]>=dpt[y])x=fa[x][j];if(x==y)return x;for(j=19;~j;j--)if(fa[x][j]!=fa[y][j])x=fa[x][j],y=fa[y][j];return fa[x][0];
}
inline int Distance(int x,int y)
{return dpt[x]+dpt[y]-(dpt[LCA(x,y)]<<1);
}
void Query(int x,int y,int z)
{int re=0;int lca=LCA(x,y);re+=dpt[x]-dpt[lca];re+=dpt[y]-dpt[lca];re+=Distance(lca,z);if(re<ans)ans=re,anspoint=lca;
}
int main()
{int i,j,x,y,z;cin>>n>>m;for(i=1;i<n;i++)scanf("%d%d",&x,&y),Add(x,y),Add(y,x);DFS(1);for(j=1;j<=19;j++)for(i=1;i<=n;i++)fa[i][j]=fa[ fa[i][j-1] ][j-1];for(i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);ans=0x3f3f3f3f;Query(x,y,z);Query(y,z,x);Query(z,x,y);printf("%d %d\n",anspoint,ans);}
}

BZOJ 1787 AHOI2008 紧急集合 倍增LCA相关推荐

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

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

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

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

  3. [bzoj1787][Ahoi2008]Meet 紧急集合 倍增LCA

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

  4. bzoj1787.紧急集合(倍增LCA)

    有一棵树有 N 个结点,共有 M 次查询,每次询问树上三个点到树上哪个点汇合距离最近,输出这个汇合点和最短距离 倍增 LCA,每次询问两两求 LCA ,三个 LCA 深度最深的点是集合点. #incl ...

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

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

  6. [Ahoi2008] Meet 紧急集合 (LCA+倍增+rmq-st)

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

  7. 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)

    [AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有 n n n 个等待点,有 n − 1 n-1 n−1 条道路连接着它们 ...

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

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

  9. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2144 是 hydro 的 BZOJ ...

最新文章

  1. 解决 IDEA 使用过程中让你觉得不爽的一些问题
  2. Javascript的prototype
  3. Educational Codeforces Round 44 (Rated for Div. 2)
  4. js经典试题之数据类型
  5. nutch mysql hadoop_nutch2.2.1+ hadoop1.2.1 + mysql5.6.13
  6. 【CC精品教程】ContextCapture 4.4.12(CC,Smart 3D)简体中文版安装教程(附安装包下载)
  7. 1011 A+B 和 C (15分)
  8. iPhone 12 Mini曝光:售价5000内、电池容量不忍看
  9. Balanced Numbers数位dp
  10. 内存检查工具valgrind介绍、安装与使用
  11. Python 这么热,运维要不要追赶 Python 的热潮?
  12. 删除ubuntu双系统后,开机出现grub黑屏,删除双系统引导项解决
  13. 苹果手机html5定位,苹果手机常去地点可以记录多长时间?
  14. AQS源码解读(六)——从PROPAGATE和setHeadAndPropagate()分析共享锁的传播性
  15. 半小时漫画股票实战法观看记录,观看更新
  16. es中索引对象包含数组子节点时, 查询和聚合的统计需要注意的问题。
  17. 朋友圈大数据:你的朋友圈出卖了你,大数据就是这么给力!!!
  18. linux人员最爱用的键盘,Linux工作者必备-filco 87 忍者2代 黑色青轴
  19. 软文发稿推广要怎么做?
  20. 红米4A Android 版本,红米4A评测:4A搭载深度定制基于Android6.0.1系统MIUI 8 - 红米4A评测:双11手机单品销量第一 怎么样好不好用?...

热门文章

  1. linux查看license情况,检查SCL服务状态和License使用情况
  2. 图片读取器和皮肤库设计
  3. 如何在三维模型中按一定密度提取点云数据(详细说明)
  4. PT SDC命令持续更新中
  5. keil加入文件夹软件崩溃解决办法
  6. android调起QQ聊天,QQ个人资料,QQ群资料
  7. android服务下载apk,Android 一个简单的版本更新下载apk小示例
  8. Linux Team
  9. SQL注入实战MySQL_SQL注入实战-MySQL
  10. 10亿级存储挑战!看一看、微信广告、微信支付、小程序都在用的存储系统究竟是怎么扛住的?!