题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1832

直接找三个点lca就可以了。这叫lca模版题。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 500500
#define inf 2000000000
#define mm 1000000007
using namespace std;
struct data{int obj,pre;
}e[maxn*2];
int head[maxn],bin[22],a[maxn],d[maxn],fa[maxn][22],tot,n,m;
int read(){int x=0,f=1; char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
void insert(int x,int y){e[++tot].obj=y; e[tot].pre=head[x]; head[x]=tot;
}
void dfs(int u){rep(i,1,20) if (d[u]>=bin[i]) fa[u][i]=fa[fa[u][i-1]][i-1];for (int j=head[u];j;j=e[j].pre){int v=e[j].obj;if (v!=fa[u][0]) {fa[v][0]=u; d[v]=d[u]+1; dfs(v);}}
}
int lca(int x,int y){if (d[x]<d[y]) swap(x,y);int t=d[x]-d[y];rep(i,0,20) if (t&bin[i]) x=fa[x][i];down(i,20,0) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];if (x==y) return x;return fa[x][0];
}
int main(){//freopen("in.txt","r",stdin);bin[0]=1; rep(i,1,20) bin[i]=bin[i-1]*2;n=read(); m=read();rep(i,1,n-1){int x=read(),y=read();insert(x,y); insert(y,x);}d[1]=0;dfs(1);rep(i,1,m) {int ans=inf,ans2;int x=read(),y=read(),z=read(),t1=lca(x,y),t2=lca(y,z),t3=lca(x,z);if (d[x]+d[y]+d[z]-d[t1]-2*d[lca(z,t1)]<ans) ans=d[x]+d[y]+d[z]-d[t1]-2*d[lca(z,t1)],ans2=t1;if (d[x]+d[y]+d[z]-d[t2]-2*d[lca(x,t2)]<ans) ans=d[x]+d[y]+d[z]-d[t2]-2*d[lca(x,t2)],ans2=t2;if (d[x]+d[y]+d[z]-d[t3]-2*d[lca(y,t3)]<ans) ans=d[x]+d[y]+d[z]-d[t3]-2*d[lca(y,t3)],ans2=t3;printf("%d %d\n",ans2,ans);}return 0;
} 

转载于:https://www.cnblogs.com/ctlchild/p/5122681.html

BZOJ1832: [AHOI2008]聚会相关推荐

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

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

  2. AHOI2008 聚会

    洛谷 BZOJ 分析 任意两个点的最短距离一定经过它们的 \(LCA\) ,推广到三个点的情况,设这三个点分别是 \(x,y,z\) ,先求出 \(x, y\) 的 \(LCA\) 为 \(w\) , ...

  3. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

  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. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. P4281 [AHOI2008]紧急集合 / 聚会

    P4281 [AHOI2008]紧急集合 / 聚会 军训完.发现我自己连lca版都不会了 然后就强行写了这个题 然后卡了两天的原因就是计算距离写错了 #include<cstdio> #i ...

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

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

  8. 洛谷· [AHOI2008]紧急集合 / 聚会

    初见安~这里是传送门:洛谷P4281紧急集合/聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个 ...

  9. 题解【[AHOI2008]紧急集合 / 聚会】

    简化版题目: 有一棵 N N N个节点的树,和 Q Q Q组询问 有三个人分别在点 x , y , z x,y,z x,y,z现在希望你找到一个点,使得 三个人到这个点的距离和最小. 题目分析 首先, ...

最新文章

  1. 从一个Bug开始,重新认识一个强大的 Gson
  2. Nginx —— 用HTTP核心模块配置一个静态的Web服务器
  3. 学计算机的学校17w,摇号中签率23.19%,学费一年17W?11所民校详情介绍!
  4. 手机蓝牙连不上jimu机器人_蓝牙连接出现问题到解决问题,一件小事,感慨实时逆向思维的重要...
  5. 基于Keras的卷积神经网络用于猫狗分类(未进行数据增强)+卷积层可视化
  6. 天亮了起来的飞鸽传书官方下载
  7. java操作Excel实现读写
  8. Python函数调用(2)
  9. php链接没有下划线,html超链接怎么去掉下划线
  10. 服务封装软件 nssm
  11. oracle用nas还是本地存储,为什么大家都在用NAS网络存储?
  12. 用python 控制台打印图片示例
  13. android面试题分析总结
  14. 链家网爬取深圳租房分析
  15. 手机软件开发入门 [转]
  16. barcode4j CODE128/EAN128生成 不定长 msg值 分隔符
  17. gl-opendrive插件(车俩3D仿真模拟自动驾驶)
  18. ResNet DenseNet(原理篇)
  19. 使用scp命令传文件
  20. 30分钟搭建你的静态网站

热门文章

  1. 多表利用DIH批量导入数据并建立索引注意事项
  2. MyBatis的接口式编程Demo
  3. 朴素的UNIX之-Linux CFS一个注释
  4. BerkeleyDB-JE数据库操作封装
  5. GridView控件RowDataBound事件中获取列字段的几种方法(转)
  6. BlackBerry 应用程序开发者指南 第一卷:基础--第7章 使用数据报(Datagram)连接...
  7. php软件开发--mongodb
  8. python默认参数的传参方式_如何跳过在Python方法中提供默认参数
  9. python脚本转二进制_使用此Python脚本在Base94中编码二进制文件
  10. 夏天面试男生穿什么_你今年夏天在做什么?