题目

P3884 [JLOI2009]二叉树问题

思路

深搜统计深度,倍增\(\text{LCA}\)求边数

\(Code\)

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define MAXN 100
#define max_(a,b) a>b?a:b;
using namespace std;
int n,cnt,head[MAXN],dep[MAXN],fa[MAXN][20],lg[MAXN];
int sum1,sum2,ans1,ans2[MAXN];
struct Edge{
int next,to;
}edge[MAXN<<1];
inline int qpow(int a,int b){
int ans=1,base=a;
while(b){
if(b&1) ans*=base;
base*=base;
b>>=1;
}
return ans;
}
inline void addedge(int from,int to){
edge[++cnt].to=to,edge[cnt].next=head[from];
head[from]=cnt;
}
inline int read(){
int x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
void dfs(int u,int father){
dep[u]=dep[father]+1;
ans2[dep[u]]++;
ans1=max_(ans1,dep[u]);
fa[u][0]=father;
for(int i=head[u];i;i=edge[i].next){
int x=edge[i].to;
if(x!=father) dfs(x,u);
}
}
void lca(int x,int y){
if(dep[x]<dep[y]){
while(dep[y]>dep[x]){
sum2+=qpow(2,lg[dep[y]-dep[x]]-1);
y=fa[y][lg[dep[y]-dep[x]]-1];
}
}else{
while(dep[x]>dep[y]){
sum1+=qpow(2,lg[dep[x]-dep[y]]-1);
x=fa[x][lg[dep[x]-dep[y]]-1];
}
}
if(x==y) return;
for(int k=lg[dep[x]]-1;k>=0;--k){
if(fa[x][k]!=fa[y][k]){
sum1+=qpow(2,k),sum2+=qpow(2,k);
x=fa[x][k],y=fa[y][k];
}
}
sum1++,sum2++;
} int main(){
n=read();
for(int i=1,u,v;i<n;++i){
u=read(),v=read();
addedge(u,v);
addedge(v,u);
}
dfs(1,0);
for(int i=1;(1<<i)<=n;++i){
for(int j=1;j<=n;++j){
fa[j][i]=fa[fa[j][i-1]][i-1];
}
}
for(int i=1;i<=n;++i){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
int ans=0;
for(int i=1;i<MAXN;++i){
if(ans2[i]>ans){
ans=ans2[i];
}
}
int u,v;
u=read(),v=read();
printf("%d\n%d\n",ans1,ans);
lca(u,v);
printf("%d\n",sum1*2+sum2);
return 0;
}

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

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

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

  2. [洛谷P1040] 加分二叉树

    洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...

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

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

  4. 洛谷P3884 二叉树问题

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

  5. 洛谷 P1305 新二叉树 Label:字符串的输出总是有惊喜

    题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式: 前序排列的完 ...

  6. 洛谷 P1040 加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  7. 洛谷 P1305 新二叉树

    P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...

  8. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  9. 洛谷P1040 加分二叉树【记忆化搜索】

    题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...

随机推荐

  1. redis cluster slots数量 为何是16384(2的14次方)

    Redis 集群并没有使用一致性hash,而是引入了哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分has ...

  2. springboot IDEA新建Maven项目的Plugins出现红线的解决方法

    将pom.xml文件copy到桌面,删除项目中的pom.xml.发现项目maven中没有任何东西后,然后将桌面的pom.xml粘贴到项目目录下,刷新maven就ok了

  3. C# List<string>之间的转换

    List<string> 转换为 string List<string> list = new List<string>(); list.Add("a&q ...

  4. css3 media媒体查询器用法总结(附js兼容方法)

    css3 media媒体查询器用法总结 标签:class   代码   style   html   sp   src 随着响应式设计模型的诞生,Web网站又要发生翻天腹地的改革浪潮,可能有些人会觉得 ...

  5. printf打印字节

    int i = 0; printf("buf:"); for(i = 0; i < sizeof(buf); i++) { printf("0x%x", ...

  6. Java 参数个数可变的函数

    示例: package my_package; public class Test { public static void main(String[] args) { out("重庆师范大 ...

  7. Flask项目初始化

    数据库实现命令初始化 1.实现命令主脚本 # coding=utf-8 from functools import wraps from getpass import getpass import s ...

  8. java系统化基础-day01-基础语法知识

    1.学前必看 该课程将系统化的讲解java基础,但是该课程并不适合零基础的学员,因为在整个java学习体系中我们是按照实际生产设计, 主体思路是以完成某个业务为主线,用到什么技术就学什么技术,即带着问 ...

  9. 关于 Spring AOP (AspectJ) 你该知晓的一切

    版权声明:本文为CSDN博主「zejian_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/javazej ...

  10. ZMQ应用

    一.  ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应 ...