BZOJ1832: [AHOI2008]聚会
题目: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]聚会相关推荐
- [BZOJ1787][Ahoi2008]Meet 紧急集合[BZOJ1832][AHOI2008]聚会
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1787 http://www.lydsy.com/JudgeOnline/problem.ph ...
- AHOI2008 聚会
洛谷 BZOJ 分析 任意两个点的最短距离一定经过它们的 \(LCA\) ,推广到三个点的情况,设这三个点分别是 \(x,y,z\) ,先求出 \(x, y\) 的 \(LCA\) 为 \(w\) , ...
- 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA
例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...
- bzoj 1787 bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)
1832: [AHOI2008]聚会 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1539 Solved: 663 [Submit][Status ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- P4281 [AHOI2008]紧急集合 / 聚会
P4281 [AHOI2008]紧急集合 / 聚会 军训完.发现我自己连lca版都不会了 然后就强行写了这个题 然后卡了两天的原因就是计算距离写错了 #include<cstdio> #i ...
- 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)
[AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有 n n n 个等待点,有 n − 1 n-1 n−1 条道路连接着它们 ...
- 洛谷· [AHOI2008]紧急集合 / 聚会
初见安~这里是传送门:洛谷P4281紧急集合/聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个 ...
- 题解【[AHOI2008]紧急集合 / 聚会】
简化版题目: 有一棵 N N N个节点的树,和 Q Q Q组询问 有三个人分别在点 x , y , z x,y,z x,y,z现在希望你找到一个点,使得 三个人到这个点的距离和最小. 题目分析 首先, ...
最新文章
- 从一个Bug开始,重新认识一个强大的 Gson
- Nginx —— 用HTTP核心模块配置一个静态的Web服务器
- 学计算机的学校17w,摇号中签率23.19%,学费一年17W?11所民校详情介绍!
- 手机蓝牙连不上jimu机器人_蓝牙连接出现问题到解决问题,一件小事,感慨实时逆向思维的重要...
- 基于Keras的卷积神经网络用于猫狗分类(未进行数据增强)+卷积层可视化
- 天亮了起来的飞鸽传书官方下载
- java操作Excel实现读写
- Python函数调用(2)
- php链接没有下划线,html超链接怎么去掉下划线
- 服务封装软件 nssm
- oracle用nas还是本地存储,为什么大家都在用NAS网络存储?
- 用python 控制台打印图片示例
- android面试题分析总结
- 链家网爬取深圳租房分析
- 手机软件开发入门 [转]
- barcode4j CODE128/EAN128生成 不定长 msg值 分隔符
- gl-opendrive插件(车俩3D仿真模拟自动驾驶)
- ResNet DenseNet(原理篇)
- 使用scp命令传文件
- 30分钟搭建你的静态网站
热门文章
- 多表利用DIH批量导入数据并建立索引注意事项
- MyBatis的接口式编程Demo
- 朴素的UNIX之-Linux CFS一个注释
- BerkeleyDB-JE数据库操作封装
- GridView控件RowDataBound事件中获取列字段的几种方法(转)
- BlackBerry 应用程序开发者指南 第一卷:基础--第7章 使用数据报(Datagram)连接...
- php软件开发--mongodb
- python默认参数的传参方式_如何跳过在Python方法中提供默认参数
- python脚本转二进制_使用此Python脚本在Base94中编码二进制文件
- 夏天面试男生穿什么_你今年夏天在做什么?