牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
任意门:https://www.nowcoder.com/acm/contest/202/F
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld
题目描述
给定平衡的定义参数d, 你需要求出所有高度为 n 的平衡树中不平衡度的最大值。
输入描述:
两个整数,n, d.
输出描述:
一个整数:所有高度为 n 的平衡树中不平衡度的最大值。
备注:
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、平衡二叉树 【构造+记忆化搜索】的更多相关文章
- 牛客国庆集训派对Day2 Solution
A 矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...
- 2019牛客国庆集训派对day2
A(模拟): #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const double ...
- 牛客国庆集训派对Day2
题目链接:https://www.nowcoder.com/acm/contest/202/A A 题意:给出最大4096*64和64*4096的矩阵,其中有一个矩阵只含有0和1,问你它们相乘所得到得 ...
- 牛客国庆集训派对Day2 H 期望
小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀有卡牌不会被重复抽到.小 ...
- 图论+思维(2019牛客国庆集训派对day2)
题意:https://ac.nowcoder.com/acm/contest/1107/J n个点的完全图编号0-n-1,第i个点的权值为2^i,原先是先手选取一些边,然后后手选取一些点,满足先手选取 ...
- 牛客国庆集训派对Day6 A Birthday 费用流
牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 2019牛客国庆集训派对day1(A, B E F K)
链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...
- 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)
链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...
随机推荐
- opensuse install oracle 11gR2 Error in invoking target 'agent nmhs' of makefile '../ins_emagent.mk'
转自 http://blog.csdn.net/ly5156/article/details/6647563 遭遇Error in invoking target 'agent nmhs' of ma ...
- 游戏源码--Unity开源Moba游戏-服务器-客户端完整V1.0
http://www.manew.com/thread-111658-1-1.html
- html和css(一)
简单点来说html和css就是一起连在使用,有了html和css会使网页更加有活力,看起来更加的好看. html是做关于网页标签这一块相当于骨架,更深的还需要另一个来完成,那就是css,相当于向里面加 ...
- 关于两个 IQueryable 合并
原先根据需求要对数据进行两种筛选,起初写过滤条件,但是过滤后发现有的数据重叠.因此改为查询两次. 因为查询后返回的是两个相同的.匿名的 IQueryable ,最终的目的是想两个 类型结合成一个. 参 ...
- bootstrap dialog对话框,完成操作提示框
1. 依赖文件: bootstrap.js bootstrap-dialog.js bootstrap.css bootstrap-dialog.css 2.代码 BootstrapDialog.co ...
- [MySQL] - MySQL连接字符串总结
来源:http://blog.sina.com.cn/s/blog_5f0dab1e0100e4pv.html?retcode=0 一.MySQL Connector/ODBC 2.50 (MyODB ...
- 【转】sqlserver字符串拆分(split)方法汇总
Java..net等开发工具具有split功能,最近在Sqlserver中碰到这个需求. 方法1:动态SQL法 ),) set @string='1,2,3,4,5,6,7,8,9,10' set @ ...
- java字节码速查笔记
java字节码速查笔记 发表于 2018-01-27 | 阅读次数: 0 | 字数统计: | 阅读时长 ≍ 执行原理 java文件到通过编译器编译成java字节码文件(也就是.class文件) ...
- SQLAlchemy的使用---M2M多对多关系
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Stri ...
- all-to-mqtt