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 紧急集合的更多相关文章

  1. bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1841  Solved: 857[Submit][ ...

  2. BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )

    这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

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

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

  7. bzoj1787 [Ahoi2008]Meet 紧急集合

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

  8. 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2259  Solved: 1023[Submit] ...

  9. [Ahoi2008]Meet 紧急集合

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

随机推荐

  1. innobackupex的使用

    优点: 不暂停服务器创建Innodb热备份 为mysql做增量的备份 在mysql服务器之间做在线表迁移 使创建mysql replication更加容易 备份mysql但不增加服务器的负载 安装:x ...

  2. 动手实现 React-redux(五):Provider

    我们要把 context 相关的代码从所有业务组件中清除出去,现在的代码里面还有一个地方是被污染的.那就是 src/index.js 里面的 Index: ... class Index extend ...

  3. oracle 函数、聚焦函数

    oracle 常用的函数 以及 聚焦函数 --1,字符函数 --当没有表可以用个的时候oracle自带一个虚表dual -- || 表示连接符号 将字符串连接到一起 式显示 Lower(char):将 ...

  4. SpringBoot 2.x (7):拦截器

    类似以前SpringMVC的拦截器,但也有一些区别 SpringBoot的拦截器有两种方式: 第一种方式:过时的方式,适用于SpringBoot1.x的方式 package org.dreamtech ...

  5. Git之删除本地和远程项目

    目录 删除本地项目 删除远程项目 删除本地项目: git rm -rf project  或者 rm -rf project   [删除工作区项目] git add project [将删除的项目添加 ...

  6. Spring的校验(Validator)

    使用Spring校验的大体流程: 最首先要有配置文件xml的支持(spring_validate.xml).(当然在web.xml中要有对该xml的体现) <beans xmlns=" ...

  7. [ HEOI 2016 ] 树

    \(\\\) Description 给出一颗树,开始只有 \(1\) 号节点有标记. \(\ C\ x\) 对 \(x\) 号节点打标记 \(\ Q\ x\) 查询 \(x\) 号节点深度最深的有标 ...

  8. [BZOJ2761][JLOI2011]不重复数字 暴力

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2761 直接暴力. #include<cstdio> #include<c ...

  9. VS2015调用低版本lib库出现“无法解析的外部符号 __snprintf ”问题的解决

    VS2015在调用低版本lib库出现有时会出现“无法解析的外部符号 __snprintf ”的问题,解决方法是加入lib库“legacy_stdio_definitions.lib”到工程.

  10. 自己动手实现Spring IoC框架

    钻研Spring 源码也有一段时间了,对Spring IoC的实现原理理解算是比较透彻了,要实现一款IoC容器,简单的概括无非需要以下几个步骤: 1.定义用来描述bean的配置的Java类,例如我们有 ...