bzoj 1787 Meet 紧急集合
Meet 紧急集合
这个题是在脖子oj(清北某奆佬给起的名字)八中oj(大视野在线评测)上的。
给出bzoj链接。
这个题还是求最近公共祖先的问题。
而该题不同于别的题,它是需要求三个点的最近公共祖先。
我们就需要求出三个点两两之间的LCA。
而这三个LCA之间,必有两个是相同的。
如果两个点相同,那另一点就是那三个点的LCA。
如果三个点都相同,那么该点就是那三个点的LCA。
最后还需要统计走过的边的长度。
三个点都相同的情况很好搞,就是计算三个点与那个LCA的深度差,加起来就是答案。
但是两个点就难一点。如果lca_a_b与lca_a_c相同,就需要求出lca_b_c到a,b,c的长度,就可以转化成b,c到它们的最近公共祖先lca_b_c的长度,和lca_b_c,a到它们的最近公共祖先lca_a_b(或lca_a_c)的长度。
那么就先求出lca_b_c与b和c的深度差,再求出lca_a_b(或lca_a_c)与lca_b_c和a的深度差,加起来就是结果。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 500010
#define M 1000010
using namespace std;
int next[M],to[M],head[N],num,size[N],deep[N],father[N],top[N],n,m,a,b,c,c1,c2,c3,ans;
void add(int false_from,int false_to){
next[++num]=head[false_from];
to[num]=false_to;
head[false_from]=num;
}
void dfs1(int x){
size[x]=;
deep[x]=deep[father[x]]+;
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]){
father[to[i]]=x;
dfs1(to[i]);
size[x]+=size[to[i]];
}
}
void dfs2(int x){
int mmax=;
if(!top[x])
top[x]=x;
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]&&size[to[i]]>size[mmax])
mmax=to[i];
if(mmax){
top[mmax]=top[x];
dfs2(mmax);
}
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]&&to[i]!=mmax)
dfs2(to[i]);
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])
swap(x,y);
x=father[top[x]];
}
if(deep[x]<deep[y])return x;
return y;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;++i){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs1();
dfs2();
for(int i=;i<=m;++i){
scanf("%d%d%d",&a,&b,&c);
ans=;
c1=lca(a,b);
c2=lca(a,c);
c3=lca(b,c);
if(c1==c2&&c2==c3){
ans=abs(deep[c1]-deep[a])+abs(deep[c1]-deep[b])+abs(deep[c1]-deep[c]);
printf("%d %d\n",c1,ans);
}
else
if(c1==c2){
ans+=deep[b]+deep[c]-deep[c3]*;
ans+=deep[c3]+deep[a]-deep[c1]*;
printf("%d %d\n",c3,ans);
}
else
if(c1==c3){
ans+=deep[a]+deep[c]-deep[c2]*;
ans+=deep[c2]+deep[b]-deep[c1]*;
printf("%d %d\n",c2,ans);
}
else{
ans+=deep[a]+deep[b]-deep[c1]*;
ans+=deep[c1]+deep[c]-deep[c2]*;
printf("%d %d\n",c1,ans);
}
}
return ;
}
bzoj 1787 Meet 紧急集合的更多相关文章
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1841 Solved: 857[Submit][ ...
- BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )
这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...
- bzoj 1787: [Ahoi2008]Meet 紧急集合
1787: [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 ...
- BZOJ 1787: [Ahoi2008]Meet 紧急集合 LCA
1787: [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 ...
- BZOJ 1787: [Ahoi2008]Meet 紧急集合(lca+贪心)
[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 ...
- 1787: [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1482 Solved: 652[Submit][ ...
- bzoj1787 [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2272 Solved: 1029 [Submi ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/p ...
随机推荐
- 150 Evaluate Reverse Polish Notation 逆波兰表达式求值
求在 逆波兰表示法 中算术表达式的值.有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达.例如: ["2", "1&quo ...
- 使用VMwaver 克隆CentOS 6.9网卡配置报错
报错信息: 克隆完成之后,使用的是NAT模式,进入系统之后有IP地址也可以ping外网,但是没有ifcfg-eth0这个文件,使用setup命令配置网卡时报以下错误: 待解决-
- [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...
- 关于Control.Dispatcher.BeginInvoke卡界面
Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住. Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不 ...
- PE刷题记
PE 中文翻译 最喜欢做这种很有意思的数学题了虽然数学很垃圾 但是这个网站的提交方式好鬼畜啊qwq 1.Multiples of 3 and 5 直接枚举 2.Even Fibonacci numbe ...
- P1303 A*B Problem
题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式: 积 输入输出样例 输入样例#1: 1 2 输出样例#1: 2 说明 需用高精 #include<iostream> # ...
- SQL中的笛卡儿积问题和多表连接操作
(使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...
- iOS 根据屏幕宽度, 高度判断手机设备
#define iPhone_5 [UIScreen mainScreen].bounds.size.width == 320.0 #define iPhone_6 [UIScreen mainScr ...
- 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table
基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367
- Omnidirectional DSO: Direct Sparse Odometry with Fisheye Cameras 论文摘要
1. Abstract 通过一种Unified Omnidirectional Model作为投影方程. 这种方式可以使用图像的所有内容包括有强畸变的区域,而现存的视觉里程计方案只能修正或者切掉来使用 ...