HDU 5524:Subtrees
Subtrees
一棵有N个节点的完全二叉树,问有多少种子树所包含的节点数量不同。
输入有多组数据,不超过1000组.
每组数据输入一行包含一个整数N.(1\leq N\leq {10}^{18})(1≤N≤1018)
对于每组数据输出一行,表示不同节点数的子树有多少种.
5
6
7
8
3
4
3
5
一颗完全二叉树,左右子树都会为完全二叉树,其中必然有一个最后一层是满的。对于最后一层是满的完全二叉树,每一层的节点的子树形态都是相同的,只统计logN种,然后递归处理另一颗子树。最后对记录下的所有子树根据节点数判重.
这道题想了很久,果然递归真的是省事啊。。。
网上的题解完全看不懂什么意思,之前也一直不敢写递归,总怕出错。这次敲完爽翻了。我真是太弱了。。。这道题兴奋半天。。。
具体解释见代码:
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <set>
using namespace std; typedef long long ll; ll n;
set<ll>an; void solve(ll x)
{
if (x <= 0)
return;
if (x == 1)
{
an.insert(0);
return;
}
int i;
ll num, k, nn, nk;
for (i = 0; i <= 60; i++)
{
num = (1LL << i);
if ((num - 1) == x)//中奖了,是满二叉树(其实早晚会中奖......)
{
k = 0;
nn = 2;
while (k + 1 <= x)
{
an.insert(k);
k = k + nn;
nn = nn << 1;
}
return;
}
if (num >= x)
{
break;
}
}
an.insert(x - 1);
i--;
nn = (1LL << i) - 1;//除去最后一层的节点数
k = x - nn;//最后一层的节点数 nk = ((1LL << i) >> 1);//最后一层应该有的一半节点数
ll temp = (nn - 1) >> 1;
ll le, ri;
if (k <= nk)
{
le = temp + k;//搜索左子树节点
ri = temp;//搜索右子树节点
}
else
{
le = temp + nk;
ri = temp + k - nk;
}
solve(le);
solve(ri);
} int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); while (cin >> n)
{
an.clear();
solve(n);
cout << an.size() << endl;
}
//system("pause");
return 0;
}
HDU 5524:Subtrees的更多相关文章
- HDU - 6409:没有兄弟的舞会(数学+思维)
		链接:HDU - 6409:没有兄弟的舞会 题意: 题解: 求出最大的 l[i] 的最大值 L 和 r[i] 的最大值 R,那么 h 一定在 [L, R] 中.枚举每一个最大值,那么每一个区间的对于答 ... 
- POJ 3321:Apple Tree  +  HDU 3887:Counting Offspring(DFS序+树状数组)
		http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ... 
- (树)Subtrees -- hdu -- 5524
		http://acm.hdu.edu.cn/showproblem.php?pid=5524 Subtrees Time Limit: 2000/1000 MS (Java/Others) Me ... 
- hdu 5524 Subtrees dfs
		Subtrees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ... 
- HDU 2732:Leapin' Lizards(最大流)
		http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ... 
- HDU 4289:Control(最小割)
		http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ... 
- HDU 3605:Escape(最大流+状态压缩)
		http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ... 
- HDU 4292:Food(最大流)
		http://acm.hdu.edu.cn/showproblem.php?pid=4292 题意:和奶牛一题差不多,只不过每种食物可以有多种. 思路:因为食物多种,所以源点和汇点的容量要改下.还有D ... 
- 矩阵乘法 --- hdu 4920 : Matrix multiplication
		Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ... 
随机推荐
- 00-Docker基本安装
			目录 00-Docker基本安装 参考 安装与配置 启动与测试 00-Docker基本安装 Docker Version: 19.03.5 
- 健壮的I/O(RIO)
			在上篇Unix系统级I/O中,我们介绍了有关在Unix环境下读取和写入文件的函数read和write,也提到了标准I/O在进行网络I/O时的局限性.但是在某些地方,直接使用read和write往往会出 ... 
- Dubbo教程:入门到实战
			Dubbox简介 Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护 ... 
- Linux - 命令 - top命令
			负载检查:https://blog.csdn.net/HANLIPENGHANLIPENG/article/details/79172053 参考:https://blog.csdn.net/gxia ... 
- JavaSE复习~Java语言发展史
			Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ... 
- [转]JDK1.0到12各版本新特性
			原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ... 
- Cisco AP-格式化AP
			故障情况:APC11-AP04#sho capwap ip config LWAPP Static IP ConfigurationIP Address 172.17.239.204I ... 
- CSS shapes布局教程
			文章参考至 一.前言&索引 CSS Shapes布局可以实现不规则的文字环绕效果,需要和浮动配合使用. 兼容性如下图: 还是很不错的,移动端可用,内部中后台项目可用. CSS shapes布局 ... 
- techiediaries网站的Laravel 6系列教程
			Laravel 6 Tutorial & New Features - Build a CRM [PART 1] Laravel 6 REST API CRUD Tutorial - Buil ... 
- java 第三次课后作业
			1.java字段初始化的规律 public class gouzao { public static void main(String[] args) { test te=new test(); Sy ... 
