题意:给出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. 【BZOJ4006】管道连接(动态规划,斯坦纳树)

    题面 BZOJ 洛谷 题解 和这题区别不是很大吧. 基本上拿过来改一下就做完了. #include<iostream> #include<cstdio> #include< ...

  2. 【uoj131】 NOI2015—品酒大会

    http://uoj.ac/problem/131 (题目链接) 题意 给出一个字符串,每个后缀有一个权值${a_i}$,这些后缀两两之间存在公共前缀.问能够组成长度从0~n-1的公共前缀的后缀的方案 ...

  3. 【bzoj1396】 识别子串

    http://www.lydsy.com/JudgeOnline/problem.php?id=1396 (题目链接) 题意 问字符串S每一位的最短识别子串是多长(识别子串指包含这个字符且只出现在S中 ...

  4. adb server version (32) doesn't match this client (36); killing...

    http://blog.csdn.net/seaker_/article/details/55107598 FAQ: adb server version (36) doesn't match thi ...

  5. C/C++ 移位计算代替乘除运算

    测试移位和乘除的比较,发现移位比乘除运算快一个位数的速度,但是难点在于判断是否是2的幂次级的数,如果不是还得通过代码拆分到2的幂次+上分子的累和,然后通过移位得到2的次幂数这样; 下列代码只是简单的判 ...

  6. python文件加入python环境变量

    在python中,把一个python文件加入到python环境变量中,以方便其他python文件调用. 方式一: import sys sys.path.append(r'E:\syz\ly-code ...

  7. Java基础-程序流程控制第二弹(循环结构)

    Java基础-程序流程控制第二弹(循环结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 流程控制有三种基本结构:顺序结构,选择结构和循环结构.一个脚本就是顺序结构执行的,选择结 ...

  8. java反射机制的理解

    反射机制是什么概念?大多都有介绍,指的是程序在运行状态中,能够加载一个只有类名的类,加载完之后会在堆上产生一个Class对象.通过这个 Class对象可以获得类的属性.方法和其他类信息.之前对反射的应 ...

  9. 洛谷P2766 最长递增子序列问题

    https://www.luogu.org/problemnew/show/P2766 注:题目描述有误,本题求的是最长不下降子序列 方案无限多时输出 n 网络流求方案数,长见识了 第一问: DP 同 ...

  10. Jenkins + jmeter + ant + git 自动化集成

     背景: 目前测试组项目多,手头任务紧,且回归测试任务量较大,经过组内讨论采用相对快速高效的方式(自动化接口测试类型),在迭代任务中把主要精力集中在新需求测试:而回归测试时,主要采用自动化测试,提高测 ...