POJ 1095 Trees Made to Order(卡特兰数列)
中间计算的各种细节。有的细节没处理好,就wa了。。。主要思路就是根据卡特兰数列的:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
LL ctl[];
LL sum[];
struct node
{
int l,r;
}tree[];
int t;
void build(LL n,int rt)
{
int i,pos;
if(n == ||n == )
{
return ;
}
for(i = ;i <= ;i ++)
{
if(sum[i] >= n)
break;
}
pos = i;
n -= sum[pos-];
for(i = ;i <= pos-;i ++)
{
if(n <= ctl[i]*ctl[pos--i])
break;
n -= ctl[i]*ctl[pos--i];
}
if(i != )
{
tree[rt].l = t ++;
if(n%ctl[pos--i] != )
build(sum[i-]+n/ctl[pos--i]+,t-);
else
build(sum[i-]+n/ctl[pos--i],t-);
}
if(i != pos-)
{
tree[rt].r = t ++;
if(n%ctl[pos--i] == )
build(sum[pos--i]+ctl[pos--i],t-);
else
build(sum[pos--i]+n%ctl[pos--i],t-);
}
}
void show(int x)
{
if(x == -)
return ;
if(tree[x].l != -)
printf("(");
show(tree[x].l);
if(tree[x].l != -)
printf(")");
printf("X");
if(tree[x].r != -)
printf("(");
show(tree[x].r);
if(tree[x].r != -)
printf(")"); }
int main()
{
int i;
LL n;
ctl[] = ;
ctl[] = ;
sum[] = ;
for(i = ;i <= ;i ++)
{
ctl[i] = ctl[i-]*(*i-)/(i+);
sum[i] = sum[i-] + ctl[i];
}
while(cin>>n)
{
if(n == ) break;
t = ;
for(i = ;i <= ;i ++)
tree[i].l = tree[i].r = -;
build(n,);
show();
printf("\n");
}
return ;
}
POJ 1095 Trees Made to Order(卡特兰数列)的更多相关文章
- poj 1095 Trees Made to Order 卡特兰数
这题用到了卡特兰数,详情见:http://www.cnblogs.com/jackge/archive/2013/05/19/3086519.html 解体思路详见:http://blog.csdn. ...
- POJ 1095 Trees Made to Order 最详细的解题报告
题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...
- poj 1095 Trees Made to Order
http://poj.org/problem?id=1095 先求出n个节点数的二叉树的形态有多少种.卡特兰数f[n]=f[n-1]*(4*n-2)/(n+1);再递归求. #include < ...
- Trees Made to Order——Catalan数和递归
Trees Made to Order Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7155 Accepted: 40 ...
- 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)
「BZOJ1485」[HNOI2009] 有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...
- poj 1095 题解(卡特兰数+递归
题目 题意:给出一个二叉树的编号,问形态. 编号依据 1:如果二叉树为空,则编号为0: 2:如果二叉树只有一个节点,则编号为1: 3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编 ...
- HDU.P1100 Trees Made to Order 解题报告
http://www.cnblogs.com/keam37/p/3637717.html keam所有 转载请注明出处 Problem Description We can number binar ...
- POJ 2084 Game of Connections(卡特兰数)
卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… ...
- POJ 1095
#include <iostream> #define MAXN 20 using namespace std; __int64 cat[MAXN]; int sum; void give ...
随机推荐
- django-cms 代码研究(八)app hooks
app钩子,啥玩意呢? 就是把现有的app,集成到cms的一种手段. 有两种实现方式: 1) 定义cms_app.py,如下: from cms.app_base import CMSApp from ...
- Linux的watch命令 — 实时监测命令的运行结果
Linux的watch命令 — 实时监测命令的运行结果 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得 ...
- scrapy和selenium结合抓取动态网页
1.安装python (我用的是2.7版本的) 2.安装scrapy: 详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...
- x:Name标记特性与Name属性
本文转载自silvergingko的专栏 在Xaml中定义了一个元素后,如果后面要使用该元素,则必须为该元素定义一个元素名称,在随后的Xaml中,通过元素名称来使用该元素. 在Xaml中,元素的名称定 ...
- C++ virtual descructor
[代码1] C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 ...
- Android Studio中的Module,Facet
详细内容请参看 http://www.jetbrains.com/idea/webhelp/facet.html 以及 http://www.jetbrains.com/idea/webhelp/an ...
- mysqldump备份
备份工具1.mysqldump(数据量很大时不推荐使用) myisam 锁表 innodb 行锁 mysqldump --help | less #查看mysql所有的语法 mysqldu ...
- oracle10G/11G官方下载地址集合 直接迅雷下载
Oracle Database 11g Release 2 (11.2.0.1.0) for Microsoft Windows (64-bit) http://download.oracle.c ...
- GLSL Entry point not found
解决方案: 在引用OpenGL的头文件 #include <GL/glew.h>#include <GL/glut.h> 前添加 #define GLUT_DISABLE_AT ...
- Android数据存储之sharedpreferences与Content Provider
android中对数据操作包含有: file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序 ...