任意门:https://www.nowcoder.com/acm/contest/202/F

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

平衡二叉树,顾名思义就是一棵“平衡”的二叉树。在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情况下树的高度定义为根节点左右子树高度最大值 + 1. 一棵在高度上平衡的树,节点数可能不平衡,因此再定义一棵树的不平衡度为这棵树中所有节点的左右子树的节点数之差的最大值。
给定平衡的定义参数d, 你需要求出所有高度为 n 的平衡树中不平衡度的最大值。

输入描述:

两个整数,n, d.

输出描述:

一个整数:所有高度为 n 的平衡树中不平衡度的最大值。
示例1

输入

复制

4 1

输出

复制

5

说明

下面这棵树在 d=1 的定义下高度是平衡的,其不平衡度为 5。
 

备注:

0 ≤ n, d ≤ 60

题意概括:

不要被题目蒙骗了,这是一道找规律和构造的题目。

tip:注意是所有左右子树的高度差为 d,不平衡度也是所有左右子树比较后的最大的那个。

解题思路:

思路很清晰嘛,第一个左结点为根的子树为满二叉树,第一个右结点的子树以尽量少的结点数构成一颗满足条件的二叉树,答案为这两颗子树的结点之差。

第一个左子树为满二叉树,左子树结点数 2^(N-1)-1; (快速幂)

那右边的那一半呢就进行构造建树吧,具体实现为 dfs ,每次构造它的左子树和右子树,直到达到需要的高度。但是一开始纯dfs是肯定超时,这时候需要记忆化搜索优化一下。

AC code:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define LL long long
using namespace std;
LL dp[][];
int N,d; LL dfs(int h, int step)
{
if(dp[h][step] != -) return dp[h][step];
LL sum = 1LL;
if(step == h) {dp[h][step] = sum; return sum;}
sum += dfs(h, step+); //左子树
if(step >= h-d) {dp[h][step] = sum; return sum;}
sum += dfs(h-d, step+); //右子树
dp[h][step] = sum;
return sum;
} LL qpow(int x, int n)
{
LL ans = , base = x;
while(n != ){
if(n&!=) ans*=base;
base*=base;
n>>=;
}
return ans;
} int main()
{
//d = 1;
//printf("%d\n", dfs(3, 1));
LL L, R;
//while(~scanf("%lld%lld", &N, &d)){
scanf("%d%d", &N, &d);
memset(dp, -, sizeof(dp));
if(N == || d == ) L = , R = ;
else{
L = qpow(, N-)-;
if(d >= N- ) R = ;
else R = dfs(N-d, );
}
//printf("L:%lld R:%lld\n", L, R);
printf("%lld\n", L-R);
//}
return ;
}

牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】的更多相关文章

  1. 牛客国庆集训派对Day2 Solution

    A    矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...

  2. 2019牛客国庆集训派对day2

    A(模拟): #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const double ...

  3. 牛客国庆集训派对Day2

    题目链接:https://www.nowcoder.com/acm/contest/202/A A 题意:给出最大4096*64和64*4096的矩阵,其中有一个矩阵只含有0和1,问你它们相乘所得到得 ...

  4. 牛客国庆集训派对Day2 H 期望

    小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀有卡牌不会被重复抽到.小 ...

  5. 图论+思维(2019牛客国庆集训派对day2)

    题意:https://ac.nowcoder.com/acm/contest/1107/J n个点的完全图编号0-n-1,第i个点的权值为2^i,原先是先手选取一些边,然后后手选取一些点,满足先手选取 ...

  6. 牛客国庆集训派对Day6 A Birthday 费用流

    牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...

  7. 2019牛客国庆集训派对day5

    2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...

  8. 2019牛客国庆集训派对day1(A, B E F K)

    链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...

  9. 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)

    链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...

随机推荐

  1. elastic 集群安装

    Elastic Search 安装和配置 1.下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6. ...

  2. How to Setup a Private Proxy Server on EC2 in Under 10 Minutes

    How to Setup a Private Proxy Server on EC2 in Under 10 Minutes I’ve been slacking a bit with regular ...

  3. nyoj 1205——简单问题——————【技巧题】

    简单问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给你一个n*m的矩阵,其中的元素每一行从左到右按递增顺序排序,每一列从上到下按递增顺序排序,然后给你一些数x ...

  4. ubuntu系统操作

    给ubuntu配置解析主机名 vim  /etc/hosts 192.168.23.44  Evelyn

  5. jrebel + myeclipse 实现热部署

    1.什么是jrebel JRebel是一套JavaEE开发工具.JRebel允许开发团队在有限的时间内完成更多的任务修正更多的问题,发布更高质量的软件产品. JRebel是收费软件. Jrebel 可 ...

  6. Redis的Publish/Subscribe

    Publish/Subscribe 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布 ...

  7. hdu 1255 矩形覆盖面积(面积交)

    http://www.cnblogs.com/scau20110726/archive/2013/04/14/3020998.html 面积交和面积并基本上差不多.在面积并里,len[]记录的是覆盖一 ...

  8. Csharp:asp.net CheckBoxList databind

    /// <summary> /// CheckBoxList數據源 /// 塗聚文 /// 20130705 /// /// </summary> private void s ...

  9. B树索引学习

    https://blog.csdn.net/wl044090432/article/details/53423333

  10. python 初识

    一.Python介绍 Python简介 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...