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. 基于CentOS 7.2个人网盘的实现

    首先使用YUM安装依赖环境: [root@sishen ~]#yum install python python-setuptools python-imaging python-ldap pytho ...

  2. 动手实现 React-redux(六):React-redux 总结

    到这里大家已经掌握了 React-redux 的基本用法和概念,并且自己动手实现了一个 React-redux,我们回顾一下这几节都干了什么事情. React.js 除了状态提升以外并没有更好的办法帮 ...

  3. PHP设计模式 观察者模式(Observer)

    定义 当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新. 模式要点 Event:事件 Trigger() 触发新的事件 abstract EventGenerator 事件产生者 Fu ...

  4. grunt配置详情

    这个grunt配置 是我的一个程序员朋友从网上无意间看到的,然后他亲测了下,恩,是可以的.不过我到目前还未测试过是否可以. 一.安装node, 首先确保电脑已有node的环境.然后 运行  npm i ...

  5. hihocoder1736 最大的K-偏差排列

    思路: 容易写错的贪心题. 实现: #include <bits/stdc++.h> using namespace std; int main() { int n, k; while ( ...

  6. vs 2017 下 千万不要装force utf8 这个插件

    千万不要装!!! 装了之后,传文件到linux系统下,各种xml和makefile报错(如下) Makefile:1: *** 遗漏分隔符 . 停止

  7. MY $MYVIMRC

    set nocompatiblesource $VIMRUNTIME/vimrc_example.vim"source $VIMRUNTIME/mswin.vim"behave m ...

  8. 飞秋软件的OA消息接口服务器

    由于单位使用了飞秋,同时也使用了OA,但OA的消息系统没有飞秋方便,所以大多数人还是在用飞秋沟通.但审批等流程又在OA上,所以做了个消息接口服务器,提取OA消息自动发送到飞秋上,大大方便了工作. 正好 ...

  9. 洛谷 P1454 圣诞夜的极光 == codevs 1293 送给圣诞夜的极光

    题目背景 圣诞夜系列~~ 题目描述 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. 轰隆隆……烟花响起(来自中 ...

  10. 在同一页面显示多个JavaScript统计图表

    最近我接到一个开发任务,要求就"售后服务客户满意度调查问卷表"里客户填写的反馈答案做一个统计. 问题的例子如下: 您最后一次是何时购买了我们的产品? 服务人员服务态度是否友好.工作 ...