---------------------

链接:Miku

---------------------

这一道题只需要在倍增lca的板子上改一改就可以了。

宽度和深度可以在倍增lca的dfs预处理的时候判断一下就可以,至于最后问的两点之间的距离

首先需要求出两点公共祖先的位置,然后计算他们深度的差,并且按照题目要求分别处理即可

--------------------

#include<iostream>
#include<cstdio>
using namespace std;
int head[*];
int p;
int md;
int mk;
int wei[];
struct b{
int to;
int ne;
} e[*];
int fa[*][];
int dep[*];
int n,m,s;
int logg[*];
int x,y;
void dfs(int now,int fat){
dep[now]=dep[fat]+;
md=max(md,dep[now]);
wei[dep[now]]++;
mk=max(mk,wei[dep[now]]);
fa[now][]=fat;
for(int i=;(<<i)<=dep[now];++i){
fa[now][i]=fa[fa[now][i-]][i-];
}
for(int i=head[now];i;i=e[i].ne){
if(e[i].to!=fat)
dfs(e[i].to,now);
}
}
int lca(int x,int y){
int ans=;
if(dep[x]>dep[y]){
int v=dep[y];
ans+=(*(dep[x]-dep[y]));
while(dep[x]>dep[y]){
x=fa[x][logg[dep[x]-dep[y]]-];
}
if(x==y)
return ans;
for(int k=logg[dep[x]]-;k>=;k--){
if(fa[x][k]!=fa[y][k]){
x=fa[x][k];
y=fa[y][k];
}
}
ans+=(*(v-dep[fa[x][]]));
return ans;
}
else{
ans+=(dep[y]-dep[x]);
int v=dep[x];
while(dep[x]<dep[y]){
y=fa[y][logg[dep[y]-dep[x]]-];
}
if(x==y)
return ans;
for(int k=logg[dep[x]]-;k>=;k--){
if(fa[x][k]!=fa[y][k]){
x=fa[x][k];
y=fa[y][k];
}
}
ans+=(*(v-dep[fa[x][]]));
return ans; }
} void add(int f,int t){
p++;
e[p].to=t;
e[p].ne=head[f];
head[f]=p;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n-;++i){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(,);
cout<<md<<endl<<mk<<endl;
for(int i=;i<=n;++i)
logg[i]=logg[i-]+(<<logg[i-]==i);
for(int i=;i<=;++i){
scanf("%d%d",&x,&y);
cout<<lca(x,y)<<endl;
}
return ;
}

Ac

P3884 [JLOI2009]二叉树问题的更多相关文章

  1. 洛谷 P3884 [JLOI2009]二叉树问题

    目录 题目 思路 \(Code\) 题目 P3884 [JLOI2009]二叉树问题 思路 深搜统计深度,倍增\(\text{LCA}\)求边数 \(Code\) #include<iostre ...

  2. 【luogu P3884 [JLOI2009]二叉树问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3884 对方不想和你说话并向你扔了一个lca模板. #include <cstdio> #incl ...

  3. 【洛谷P3884 [JLOI2009]】二叉树问题

    题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:4 宽度:4(同一层最多结点个数) 结点间距离: ⑧→⑥为8 (3×2+2=8) ⑥→⑦为3 (1×2+1=3) 注:结点间距离 ...

  4. 题解【洛谷P3884】[JLOI2009]二叉树问题

    题面 题解 这道题目可以用很多方法解决,这里我使用的是树链剖分. 关于树链剖分,可以看一下我的树链剖分学习笔记. 大致思路是这样的: 第\(1\)次\(dfs\)记录出每个点的父亲.重儿子.深度.子树 ...

  5. [JLOI2009]二叉树问题

    嘟嘟嘟 对于求深度和宽度都很好维护.深度dfs时维护就行,宽度统计同一个深度的节点有多少个,然后取max. 对于求距离,我刚开始以为是要走到根节点在回来,然后固输了(dep[u] - 1) * 2 + ...

  6. JLOI 2009 二叉树问题

    洛谷 P3884 [JLOI2009]二叉树问题 洛谷传送门 JDOJ 2024: [JLOI2009]二叉树问题 JDOJ传送门 Description 如下图所示的一棵二叉树的深度.宽度及结点间距 ...

  7. 洛谷P3884 二叉树问题

    题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:\(4\) 宽度:\(4\)(同一层最多结点个数) 结点间距离: \(⑧→⑥为8 (3×2+2=8)\) \(⑥→⑦为3 (1× ...

  8. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  9. 二叉树的递归实现(java)

    这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...

随机推荐

  1. Linux中inode详解

    转自:https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在 ...

  2. laravel 操作多数据库总结

    laravel 操作多数据库总结 读写分离 env配置 DB_CONNECTION=mysql DB_HOST=xxxxxx DB_PORT=xxx DB_DATABASE=xx DB_USERNAM ...

  3. HanLP《自然语言处理入门》笔记--1.新手上路

    1. 新手上路 自然语言处理(Natural Language Processing,NLP)是一门融合了计算机科学.人工智能及语言学的交叉学科,它们的关系如下图所示.这门学科研究的是如何通过机器学习 ...

  4. 程序的健壮性Robustness

    所谓的程序健壮性是指处理异常的能力,在异常中能够独立处理异常,并且把正确的答案输出. 例如: 有一个程序能够下载一个文件到指定的路径,但是这个路径是不存在的,因此程序必须要处理这个情况. 例1:下面的 ...

  5. Linux用户在第一次登录时强制更改初始密码

    迫使用户更改密码 如果你想迫使用户更改其密码,请使用下面这个命令. $ sudo chage -d0 <user-name>   最初,“-d <N>”选项应该被设成密码的“有 ...

  6. C陷阱与缺陷学习笔记

    导读 程序是由符号(token)序列所组成的,将程序分解成符号的过程,成为"词法分析". 符号构成更大的单元--语句和声明,语法细节最终决定了语义. 词法陷阱 符号(token)指 ...

  7. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  8. 深入理解ASP.NET Core依赖注入

    概述        ASP.NET Core可以说是处处皆注入,本文从基础角度理解一下原生DI容器,及介绍下怎么使用并且如何替换官方提供的默认依赖注入容器. 什么是依赖注入        百度百科中对 ...

  9. qt creator源码全方面分析(2-10-2)

    目录 Creating Your First Plugin 创建一个插件项目 构建并运行插件 文件结构 qmake项目 插件元数据模板 插件类 头文件 源文件 Creating Your First ...

  10. OFDM Modulation Scheme