P3884 [JLOI2009]二叉树问题
---------------------
链接: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]二叉树问题的更多相关文章
- 洛谷 P3884 [JLOI2009]二叉树问题
目录 题目 思路 \(Code\) 题目 P3884 [JLOI2009]二叉树问题 思路 深搜统计深度,倍增\(\text{LCA}\)求边数 \(Code\) #include<iostre ...
- 【luogu P3884 [JLOI2009]二叉树问题】 题解
题目链接:https://www.luogu.org/problemnew/show/P3884 对方不想和你说话并向你扔了一个lca模板. #include <cstdio> #incl ...
- 【洛谷P3884 [JLOI2009]】二叉树问题
题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:4 宽度:4(同一层最多结点个数) 结点间距离: ⑧→⑥为8 (3×2+2=8) ⑥→⑦为3 (1×2+1=3) 注:结点间距离 ...
- 题解【洛谷P3884】[JLOI2009]二叉树问题
题面 题解 这道题目可以用很多方法解决,这里我使用的是树链剖分. 关于树链剖分,可以看一下我的树链剖分学习笔记. 大致思路是这样的: 第\(1\)次\(dfs\)记录出每个点的父亲.重儿子.深度.子树 ...
- [JLOI2009]二叉树问题
嘟嘟嘟 对于求深度和宽度都很好维护.深度dfs时维护就行,宽度统计同一个深度的节点有多少个,然后取max. 对于求距离,我刚开始以为是要走到根节点在回来,然后固输了(dep[u] - 1) * 2 + ...
- JLOI 2009 二叉树问题
洛谷 P3884 [JLOI2009]二叉树问题 洛谷传送门 JDOJ 2024: [JLOI2009]二叉树问题 JDOJ传送门 Description 如下图所示的一棵二叉树的深度.宽度及结点间距 ...
- 洛谷P3884 二叉树问题
题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:\(4\) 宽度:\(4\)(同一层最多结点个数) 结点间距离: \(⑧→⑥为8 (3×2+2=8)\) \(⑥→⑦为3 (1× ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 二叉树的递归实现(java)
这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...
随机推荐
- Nginx-Http服务器常用配置
#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...
- java操作数组转list集合删除元素报错ConcurrentModificationException
public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>( ...
- config 模块
import configparser #配置文件 config = configparser.ConfigParser()config["DEFAULT"] = {'Server ...
- <背包>solution_CF366C_Dima and Salad
Dima and Salad Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. T ...
- linux安装mariadb
yum install -y mariadb-server 账号:root 密码:空 本地登录:mysql -u root -p 远程登录:mysql -h 192.168.0.1 -u root - ...
- what is muxing and demuxing
They're short for multiplexing and demultiplexing. Multiplexing means combining different types of d ...
- 解决dotnet错误 System.InvalidOperationException Message=Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found.
开始=>设置=>manage user certificats (管理用户证书),里面所有的.net core的全部删除 然后控制台执行: dotnet dev-certs https ...
- TypeError:Can't instantiate abstract class Ultraman with abstract methods sttack 报错
报错Can't instantiate abstract class Ultraman with abstract methods sttack 通过非常仔细的排查,发现错误如下: 1.单词拼写错误是 ...
- 认识Git与GitHub
Git介绍 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.相比CVS.SVN等版本控制工具,Git更加优秀,功能也更加强大.但是相对也难学. 使用Git来管理 ...
- 2019牛客多校2 H Second Large Rectangle(悬线法)
题意: 求第二大子矩形 思路: 设最大子矩形x*y,第二大子矩形一定在一下情况中 (x-1)*y x*(y-1) 其他最大子矩形候选者 注意去重手法 代码: #include<iostream& ...