欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1787


题意概括

  有一棵节点为n个(n≤500000)的树。接下来m次询问(m≤500000),每次给出3个点 a,b,c ,现在让你求一个点 p ,使得 dis(p,a) + dis(p,b) + dis(p,c) 最小。

  输出 p 和 dis(p,a) + dis(p,b) + dis(p,c)。


题解

  分别求3个LCA。

  学习LCA  -> 传送门

  有两个一样的,那么另外一个就是答案。


代码

#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int N=500000+5,M=N*2;
struct Gragh{int cnt,y[M],nxt[M],fst[N];void set(){cnt=0;memset(fst,0,sizeof fst);}void add(int a,int b){y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;}
}g;
int n,m,depth[N],anst[N][20];
void dfs(int prep,int rt){depth[rt]=depth[anst[rt][0]=prep]+1;for (int i=1;i<20;i++)anst[rt][i]=anst[anst[rt][i-1]][i-1];for (int i=g.fst[rt];i;i=g.nxt[i])if (g.y[i]!=prep)dfs(rt,g.y[i]);
}
int LCA(int a,int b){if (depth[a]>depth[b])swap(a,b);for (int j=depth[b]-depth[a],i=0;j>0;j>>=1,i++)if (j&1)b=anst[b][i];if (a==b)return a;for (int i=19;i>=0;i--)if (anst[a][i]!=anst[b][i])a=anst[a][i],b=anst[b][i];return anst[a][0];
}
int main(){scanf("%d%d",&n,&m);g.set();for (int i=1,a,b;i<n;i++){scanf("%d%d",&a,&b);g.add(a,b);g.add(b,a);}depth[0]=-1;memset(anst,0,sizeof anst);dfs(0,1);for (int i=1,a,b,c,ans,pos;i<=m;i++){scanf("%d%d%d",&a,&b,&c);int p1=LCA(a,b),p2=LCA(a,c),p3=LCA(b,c);if (p1==p2)pos=p3;else if (p1==p3)pos=p2;elsepos=p1;int q1=LCA(pos,a),q2=LCA(pos,b),q3=LCA(pos,c);ans=depth[a]+depth[b]+depth[c]+depth[pos]*3-depth[q1]*2-depth[q2]*2-depth[q3]*2;printf("%d %d\n",pos,ans);}return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ1787.html

BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA相关推荐

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

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

  2. bzoj1787 [Ahoi2008]Meet 紧急集合

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

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

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

  4. BZOJ1787: [Ahoi2008]Meet 紧急集合

    [传送门:BZOJ1787] 简要题意: 给出有n个点的图,n-1条无向边,保证任意两点之间能互相到达,每条边的权值为1,给出m个询问,每个询问输入x,y,z,求出一个点使得三个点到这个点的距离和最短 ...

  5. [BZOJ1787][Ahoi2008]Meet 紧急集合

    原题地址 倍增LCA复习题- AC code: #include <cstdio> #include <vector> using namespace std; const i ...

  6. [BZOJ1787][Ahoi2008]Meet 紧急集合[BZOJ1832][AHOI2008]聚会

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1787 http://www.lydsy.com/JudgeOnline/problem.ph ...

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

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

  8. [Ahoi2008]Meet 紧急集合

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

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

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

最新文章

  1. php中 一行上显示多个数字,php – 打印图案以显示最多5行和5列的数字,如5 4 3 2 1和下一行4 3 2 1 5到第5行...
  2. 百度SEOB2B/论坛/网站自动更新/发布程序
  3. Spring Boot 之事件(Event)
  4. NMS非极大值抑制算法原理
  5. 企业微信对接金蝶云星空单据模板-日常费用报销
  6. 百度地图-个性化地图用法
  7. 免费从Springer Link数据库中下载论文
  8. 4条地铁线,乘船到西站!杭州西站枢纽综合交通规划设计方案出炉
  9. 圆周率:山颠一寺一壶酒
  10. Qt之绘制折线图:图标以及坐标轴设置
  11. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
  12. Forward warping and backward warping
  13. android app签名详解
  14. vue-element-admin 修改默认的全局字体尺寸为mini
  15. 成都c++语言青少年培训,成都比较有名气的少儿C++编程培训班
  16. WPF最新的电子书整理打包下载
  17. sqlmap中转注入
  18. 怎样更换计算机主板电池,笔记本电脑主板电池怎么更换?教你更换主板电池的方法...
  19. Vue3+node.js网易云音乐实战项目(三)
  20. pdf文件在线拆分如何拆分?

热门文章

  1. 疯狂的java 目录_疯狂创客圈 JAVA 高并发 总目录
  2. python pyqt eric_科学网—PyQt及Eric的安装 - 张鲁新的博文
  3. 使用说明 思迅收银系统_便利店收银使用的收银系统应该取决于什么?
  4. SQL Server 2008 R2:快速清除日志文件的方法
  5. 焊接符号标注图解示例_【干货】焊接图纸符号汇总 ,学习收藏!!
  6. 树莓派GPIO口的使用(外设相关开发WringPi库的使用,超声波、继电器)
  7. python爬虫安装错误与解决方式
  8. 做事用人 用人做事_做事:构建我的第一个Web应用程序的经验教训
  9. ui设计未来十年前景_UI设计的10条诫命
  10. 可能是全网首个前端源码共读活动,诚邀加入学习