poj1095
题意:给出n,要求输出第n个二叉树,二叉树编号规则如下图所示:

分析:g[i]表示有i个节点的二叉树,有多少种。f[i][j]表示有i个节点,且左子树有j个节点的树有多少种。
sumg[i]表示g数组前i个的和。sumf[i][j]表示f[i]数组前j项的和。
有g[i]=sum(f[i][j]),f[i][j]=g[j]*g[i - 1 - j]。
对于一个输入的n,我们先通过对sumg进行二分查找以确定节点数量,然后递归求解。
递归包含两个参数:1、当前子树节点数量tot。2、要求第num个具有这些节点的子树。
接下来在sumf[tot]中对num进行二分查找,即可确定其左子树节点个数x,从而确定其右子树的节点个数y。
通过g[y](右子树的变化数)可以判定左子树处于第几个形态。计算公式为(num - sumf[tot][x - 1]) / g[y];
同样可以确定右子树处于哪一种形态。计算公式为(num - sumf[tot][x - 1]) % g[y];
#include <iostream>
using namespace std; const long long maxx = ; long long f[maxx][maxx], g[maxx], sumg[maxx], sumf[maxx][maxx], n; long long binarysearch(long long *array, long long start, long long end, long long goal)
{
long long l, r, mid; l = start;
r = end;
while (l < r)
{
mid = (l + r) / ;
if (array[mid] < goal)
l = mid + ;
else
r = mid;
}
return l;
} void dfs(long long tot, long long num)
{
long long x = binarysearch(sumf[tot], , tot - , num), a, b; if (x > )
{
a = (num - sumf[tot][x - ]) / g[tot - x - ];
b = (num - sumf[tot][x - ]) % g[tot - x - ];
if (b == )
b = g[tot - x - ];
else
a++;
printf("(");
dfs(x, a);
printf(")");
num = b;
}
printf("X");
if (tot - - x > )
{
printf("(");
dfs(tot - x - , num);
printf(")");
}
} void work()
{
long long num; num = binarysearch(sumg, , maxx, n);
n -= sumg[num - ];
dfs(num, n);
printf("\n");
} int main()
{
long long i, j; //freopen("t.txt", "r", stdin);
f[][] = ;
g[] = ;
sumg[] = ;
g[] = sumg[] = ;
for (i = ; i < maxx; i++)
{
g[i] = sumf[i][] = f[i][] = g[i - ];
for (j = ; j < i; j++)
{
f[i][j] = g[j] * g[i - - j];
g[i] += f[i][j];
sumf[i][j] = sumf[i][j - ] + f[i][j];
}
sumg[i] = g[i] + sumg[i - ];
}
while (scanf("%d", &n) != EOF && n != )
work();
return ;
}
poj1095的更多相关文章
- POJ1095 Trees Made to Order(JAVA)
这题用到了卡特兰数,比较麻烦.关于卡特兰数的基本概念百度一下你就知道. 使用卡特兰数对数组元素进行分组之后,需要具体计算一下要求的是第几组的第几个数,然后向下递归. 首先来看利用卡特兰数分组: 从1开 ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- POJ 题目分类(转载)
Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...
- (转)POJ题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- acm常见算法及例题
转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法: (1)枚举. (poj17 ...
- poj分类
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 转载 ACM训练计划
leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode. ...
随机推荐
- Unity使用C#实现简单Scoket连接及服务端与客户端通讯
简介: 网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧 Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码. 服务端代码: [ ...
- 我的shell脚本
问题:在ip.lt文件中有600个IP,有3个文档模版,三个文档的名称结构都是“ip+一系列字符串”,要求:1.将600个IP分成3分,以三个模版为基础创建600个文档,名字结构与模版相同:2修改60 ...
- 20135306 2.4 ELF文件格式分析
2.4 ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...
- 响应式开发(四)-----Bootstrap CSS----------Bootstrap CSS概览和相关注意事项
本章先记录一些与Bootstrap CSS相关的一些特点和注意事项以及兼容性. HTML 5 文档类型(Doctype) Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正 ...
- CentOS 7.0源码包搭建LNMP方法分享(实际环境下)
CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这 ...
- 闲:测试memcpy和std::copy vector之间拷贝
预测:底层C函数肯定比stl算法快 结果:少量数据底层快,大数据以上则stl对vector的处理可能更好 C/C++: #include <iostream> #include <v ...
- Ubuntu 18.04设置dns
最近使用了最新版的ubuntu 18.04运行一些服务,然后发现服务器经常出现网络不通的情况,主要是一些域名无法解析. 检查/etc/resolv.conf,发现之前修改的nameserver总是会被 ...
- 利用Confluence搭建企业Wiki
Confluence安装与部署 下载安装包及破解包 安装包下载地址:https://www.atlassian.com/software/confluence/download-archives 破解 ...
- AAC音频格式详解
关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS: ...
- codevs 2147 数星星
2147 数星星 http://codevs.cn/problem/2147/ 题目描述 Description 小明是一名天文爱好者,他喜欢晚上看星星.这天,他从淘宝上买下来了一个高级望远镜.他十分 ...