题意:给出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的更多相关文章

  1. POJ1095 Trees Made to Order(JAVA)

    这题用到了卡特兰数,比较麻烦.关于卡特兰数的基本概念百度一下你就知道. 使用卡特兰数对数组元素进行分组之后,需要具体计算一下要求的是第几组的第几个数,然后向下递归. 首先来看利用卡特兰数分组: 从1开 ...

  2. poj分类 很好很有层次感。

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  3. 【转】POJ题目分类推荐 (很好很有层次感)

    OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...

  4. 【转】ACM训练计划

    [转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...

  5. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

  6. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

  7. acm常见算法及例题

    转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题  初期:一.基本算法:     (1)枚举. (poj17 ...

  8. poj分类

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  9. 转载 ACM训练计划

    leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode. ...

随机推荐

  1. swift网络数据请求方法

    搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 <?php // header("Content-type:text/html;charset=utf-8&qu ...

  2. BZOJ 1208 宠物收养所 | 平衡树模板题

    BZOJ 1208 宠物收养所 我犯过的错误:删除一个节点后没有update新的根节点,导致size错了! #include <cstdio> #include <cmath> ...

  3. 【django基础之ORM,增删改查】

    一.定义 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...

  4. NOIP2015D2总结

    今天居然考了一套题.NOIP2015D2. 这是当年的战绩: 360的一等奖线.好强啊! 之前做过2015的D1,但我确实不会做landlord……今天曾祥瑞学长和林可学姐都来了,他们说,朱昶宇AK, ...

  5. ECharts.js 简单示例

    ECharts.js学习(一) 简单入门 EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Vi ...

  6. 一、初识java

    理论性的东西就不在笔记中作为纪录了. 先来解释下java安装过程中的一些问题,java安装和环境配置不多做强调,可以参考http://www.cnblogs.com/JianXu/p/5158404. ...

  7. body内常用标签

    一.标签内使用的符号 # 特殊字符   空格 > 大于 < 小于 更多特殊字符:Here 二.P标签 作用:p标签表示段落 <body> <p>  吃葡萄不吐葡萄皮 ...

  8. linux查看tomcat日志

    声明:以上内容均为转载,个人对这块知识搜罗之后放在一起,非原创,以后这块有问题还会继续添加. Tomcat 日志分为下面5类: catalina . 相当命令行输出日志 localhost . 相当于 ...

  9. IOS艺术字及简单的图文混排

    NSString* alertText = [NSString stringWithFormat:@" 以下%d节课程(总课酬¥%.02lf)家长们尚未结课并评价,请尽快联系家长,否则无法获 ...

  10. jvm如何判断对象是否可以被回收

    内容基本来自周志明 深入理解Java虚拟机 第二版 第三章 .这本书还可以,不过好像也没什么其他中文的关于jvm比较好的书了 jvm要做垃圾回收时,首先要判断一个对象是否还有可能被使用.那么如何判断一 ...