题意:给出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. 【bzoj1026】 SCOI2009—windy数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1026 (题目链接) 题意 在区间${[A,B]}$有多少个数相邻两个数位上的数之差至少为2. Sol ...

  2. Python 使用CPickle和pickle模块进行序列化和反序列化

    #Cpickle使用C语言进行编写的相比pickle来说效率高很多 #-*-coding:utf-8-*-'''序列化操作'''try:    import cPickle as pickleexce ...

  3. xml的相关知识

  4. Java EE之JSTL(下)

    3.使用国际化和格式化标签库(FMT命名空间) 如果你希望创建部署在Web上,并面向庞大的国际化用户的企业级Java应用程序,那么你最终需要为世界的特定区域进行应用程序本地化.这将通过国际化实现(通常 ...

  5. 解题:APIO 2014 序列分割

    题面 拆开式子我们发现切割顺序不影响答案,所以可以设计出一个$dp[i][j]$表示到$i$为止切了$j$刀的最大收益之类的,然后做个前缀和就可以转移了. $dp[i][j]=min(dp[i][j] ...

  6. 如何获取codeforces的完整数据?(玄学方法)

    做cf题总是wa,wa了以后还没发看完整数据,好气哦! 怎么办? 这其实非常简单 首先看一下wa的那个数据有什么特点 比如说n = 1111,m = 1111 那么就if(n == 1111 & ...

  7. Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效

    这个应该属于 Qt 的一个bug,Qt assistant 给出相应的解决办法:重写函数“void paintEvent(QPaintEvent *event);”,添加下面截图中的一段代码

  8. linux查看当前文件夹的大小

    1.(方法一)ls -lht会列出当前目录下每个文件的大小,同时也会给出当前目录下所有文件大小总和 [查看谬个文件的大小,] 2.(方法二)du -sh *也会列出当前文件夹下所有文件对应的大小 [把 ...

  9. Django templates and models

    models templates models and databases models 如何理解models A model is the single, definitive source of ...

  10. Javascript 浮点计算问题分析与解决

    分析 JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的. 浮点数的精度问题不是JavaScript特有的,因为有些小数 ...