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. ...
随机推荐
- SpringBoot之mongoTemplate的使用
springboot的版本1.5.17.RELEASE. 1.mongo的IP和端口 在resources下的application.properties中加入如下内容 spring.data.mon ...
- 学习Spring Boot:(八)Mybatis使用分页插件PageHelper
首先Mybqtis可以通过SQL 的方式实现分页很简单,只要在查询SQL 后面加上limit #{currIndex} , #{pageSize}就可以了. 本文主要介绍使用拦截器的方式实现分页. 实 ...
- 学习Spring Boot:(六) 集成Swagger2
前言 Swagger是用来描述和文档化RESTful API的一个项目.Swagger Spec是一套规范,定义了该如何去描述一个RESTful API.类似的项目还有RAML.API Bluepri ...
- ActiveMQ反序列化漏洞(CVE-2015-5254)复现
0x00 漏洞前言 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等.Apache ...
- 【学习笔记】BEST定理
害怕忘记简单写一点: 无向图的生成树计数:https://www.cnblogs.com/zj75211/p/8039443.html (*ZJ学长 ORZ ) 有向图的欧拉回路计数:https: ...
- 使用 laravel 的 queue 必须知道的一些事
1. 在修改 queue 相关代码后,必须要使用 php artisan queue:restart 来重启队列服务,否则所做的修改可能不会生效(没法重现了,按理说应该和使用 queue:listen ...
- django中模板变量与内置标签以及过滤器
本文参考 官方文档 . 一 模板变量 格式: {{ variable_name }} variable_name 命名规则与变量命名规则类似,允许字符数字下划线,不允许标点. variable_ ...
- Ansible10:Playbook的角色及包含
目录 说明 一.Playbook的包含 1.tasks包含 2.handlers包含 3.混合包含 二.角色(roles) 1.创建role 2.引用roles 3.pre_tasks和post_ta ...
- kubernetes 1.9部署实践
目录 简要说明 环境说明 安装前的约定 配置etcd 生成相关证书 证书类型说明 cfssl配置 证书相关配置 生成ca证书 生成kubernetes证书 生成kubectl证书 生成kube-pro ...
- 2 Kafka Broker
Log的读写.删除流程---日志管理器(log manager)负责创建日志.获取日志.清理日志.所有的日志读写操作都交给具体的日志实例来完成. KafkaServer启动的时候,初始化三个类: Lo ...