由于是完全二叉树,所以我们可以预先知道整棵树的形状,因此可以判断根节点的两个子节点哪个是满二叉树,哪个不是满二叉树(必然是一边满,一边不满),对于满的子节点,我们可以直接求出它的不同子树的个数,也就是说我们只要递归搜不满的子节点就行了,这样一来,我们的复杂度就只有logn了。

  当然还要解决相同子树判重的问题(只有满二叉子树才会出现重复),这里我用了vis数组来标记已经计算过的子树(例如vis[i],代表树高为i+1的满二叉树,这里注意标记了树高为i的满二叉树,那么所有树高比i+1小的也都要标记掉)

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; typedef long long LL; const int maxn = ; LL _n; LL sum[maxn], f[maxn];
int vis[maxn];
LL solve(LL n) {
int po = ;
for (int i = ; i >= ; i--) {
if (sum[i] == n) {
LL tmp = ;
for (int j = i; j >= && vis[j] == ; j--) {
tmp++;
vis[j] = ;
}
return tmp;
}
else if (sum[i] < n) {
po = i; break;
}
}
//printf("po:%d\n", po);
LL ret = ;
LL res = n - sum[po];
if (res > f[po]) {//搜右边
for (int i = po; i >= && vis[i] == ; i--) {
ret++;
vis[i] = ;
}
ret+=solve(n - sum[po]-);
}
else {//搜左边
for (int i = po-; i >= && vis[i] == ; i--) {
ret++;
vis[i] = ;
}
if(po>=) ret += solve(n - sum[po - ] - );
else ret += solve(n - );
}
return ret;
} void get_table() {
f[] = ;
for (int i = ; i < ; i++) f[i] = f[i - ] << ;
sum[] = ;
for (int i = ; i < ; i++) sum[i] = sum[i - ] + f[i];
} void init() {
memset(vis, , sizeof(vis));
} int main() { get_table();
/*
for (int i = 0; i < 10; i++) printf("%lld ", f[i]);
printf("\n");
for (int i = 0; i < 10; i++) printf("%lld ", sum[i]);
printf("\n");
*/
while (scanf("%lld", &_n) == ) {
init();
LL ans = solve(_n);
printf("%lld\n", ans);
}
return ;
}

hdu 5524的更多相关文章

  1. (树)Subtrees -- hdu -- 5524

    http://acm.hdu.edu.cn/showproblem.php?pid=5524 Subtrees Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. hdu 5524 Subtrees dfs

    Subtrees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Probl ...

  3. hdu 5524 二叉树找规律,二进制相关

    input n 1<=n<=1e18 output 有n个结点的满二叉树有多少个不相同结点数的子树 做法:树有h=log2(n)层,最多有2h-2种(1除外),然后再n减去u重复的即可 # ...

  4. HDU 5524:Subtrees

    Subtrees  Accepts: 60  Submissions: 170  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 13107 ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. Angular 弹窗 控件

    这个控件个人很喜欢,比起primgNG等弹窗组建,这款弹窗可以很轻松的定义自己的样式和布局. 可控参数有:宽度,高度,是否带有关闭图标,基本满足基础弹窗需求. 并且 Title/Content/Foo ...

  2. nginx 源码安装以及后续升级https

    事情的来源是,公司要将网站从http升级到https,由于历史遗留原因,才发现现有的nginx是通过源码安装的,并没有安装ssl模块,需要现安装sll模块,这个nginx是整个公司最前端的一个代理,涉 ...

  3. thinkphp3.2+cropper上传多张图片剪切图片

    实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...

  4. Python使用代理的方法

    我们在做爬虫的过程中经常会遇到这样的情况:最初爬虫正常运行,正常抓取数据,一切看起来都是那么的美好,然而一杯茶的功夫可能就会出现错误,比如403 Forbidden:出现这样的原因往往是网站采取了一些 ...

  5. 配置redis一直启动

    1. 进入 DOS窗口 2. 在进入redis的安装目录 3. 输入:redis-server --service-install redis.windows.conf --loglevel verb ...

  6. python学习笔记(三):numpy基础

    Counter函数可以对列表中数据进行统计每一个有多少种 most_common(10)可以提取前十位 from collections import Counter a = ['q','q','w' ...

  7. 3x3开窗中值滤波器的FPGA硬件实现

    数字逻辑课程的自由设计中,我编写了一个3x3开窗的中值滤波器,处理一副128*128像素值的图像,并且最终可以在FPGA上板实现. 中值滤波的本质就是对于一个n*n的窗口,将其内部的值进行排序,取中位 ...

  8. 将linux上的Java代码上传到码云

    将linux上的Java代码上传到码云 1.在linux上直接输入命令获取git sudo apt-get install git 显示资源被占用,按照图中方法强制安装 2.建立与教材配套的目录结构 ...

  9. 20155304 2016-2017-2 《Java程序设计》实验五(网络编程与安全)实验报告

    20155304 2016-2017-2 <Java程序设计>实验五(网络编程与安全)实验报告 实验内容及步骤: 一.两人一组结对编程: 参考http://www.cnblogs.com/ ...

  10. (转) PHP 开发者该知道的 5 个 Composer 小技巧

    1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单: composer update foo/bar 此外,这个技巧还可以用来解决“警告信息问题”.你一定见过这样的警告信息: Wa ...