题目链接

中间计算的各种细节。有的细节没处理好,就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(卡特兰数列)的更多相关文章

  1. poj 1095 Trees Made to Order 卡特兰数

    这题用到了卡特兰数,详情见:http://www.cnblogs.com/jackge/archive/2013/05/19/3086519.html 解体思路详见:http://blog.csdn. ...

  2. POJ 1095 Trees Made to Order 最详细的解题报告

    题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...

  3. poj 1095 Trees Made to Order

    http://poj.org/problem?id=1095 先求出n个节点数的二叉树的形态有多少种.卡特兰数f[n]=f[n-1]*(4*n-2)/(n+1);再递归求. #include < ...

  4. Trees Made to Order——Catalan数和递归

    Trees Made to Order Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7155   Accepted: 40 ...

  5. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

    「BZOJ1485」[HNOI2009] 有趣的数列   Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...

  6. poj 1095 题解(卡特兰数+递归

    题目 题意:给出一个二叉树的编号,问形态. 编号依据 1:如果二叉树为空,则编号为0: 2:如果二叉树只有一个节点,则编号为1: 3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编 ...

  7. HDU.P1100 Trees Made to Order 解题报告

    http://www.cnblogs.com/keam37/p/3637717.html  keam所有 转载请注明出处 Problem Description We can number binar ...

  8. POJ 2084 Game of Connections(卡特兰数)

    卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… ...

  9. POJ 1095

    #include <iostream> #define MAXN 20 using namespace std; __int64 cat[MAXN]; int sum; void give ...

随机推荐

  1. HDU3345广搜 (P,E,T,#)

    War chess is hh's favorite game:In this game, there is an N * M battle map, and every player has his ...

  2. php __set() __get() __isset() __unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获 取和赋值其 ...

  3. Burst Balloons

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  4. Eclipse 一直提示 loading descriptor for 的解决方法(转)

    启动eclipse之后,进行相关操作时,弹出界面,提示:loading descriptor for xxx 解决方法: 在Eclipse左侧的Project Explorer 最右上角有一个小钮,鼠 ...

  5. (原创)Python字符串系列(1)——str对象

    在本博客 <Python字符串系列> 中,将介绍以下内容: Python内置的str对象及操作 字符串的格式化 Python中的正则表达式 re模块 本文将介绍Python内置的 str ...

  6. Kafka学习笔记(二):Partition分发策略

    kafka版本0.8.2.1 Java客户端版本0.9.0.0 为了更好的实现负载均衡和消息的顺序性,Kafka Producer可以通过分发策略发送给指定的Partition.Kafka保证在par ...

  7. 归并排序的分析与Java实现

    归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并排序 ...

  8. jquery easy ui 1.3.4 内容组件(2)

    2.1.panel(面板) panel面板是easyui里面非常基础的一个内容组件,在我们后期学的tabs (选项卡).accordion(手风琴)这两种内容组件都依赖于panel组件.构建一个pan ...

  9. hdu 1009:FatMouse' Trade(贪心)

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  10. 导入/导出Excel

    --从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*============================================================ ...