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)

 1 #include <cstdio>

 2 #include <string>

 3 #include <cstring>

 4 #include <queue>

 5 #include <map>

 6 #include <iostream>

 7 #include <algorithm>

 8 using namespace std;

 9 #define LL __int64

10 LL ctl[101];

11 LL sum[101];

12 struct node

13 {

14     int l,r;

15 }tree[200001];

16 int t;

17 void build(LL n,int rt)

18 {

19     int i,pos;

20     if(n == 1||n == 0)

21     {

22         return ;

23     }

24     for(i = 1;i <= 20;i ++)

25     {

26         if(sum[i] >= n)

27         break;

28     }

29     pos = i;

30     n -= sum[pos-1];

31     for(i = 0;i <= pos-1;i ++)

32     {

33         if(n <= ctl[i]*ctl[pos-1-i])

34         break;

35         n -= ctl[i]*ctl[pos-1-i];

36     }

37     if(i != 0)

38     {

39         tree[rt].l = t ++;

40         if(n%ctl[pos-1-i] != 0)

41         build(sum[i-1]+n/ctl[pos-1-i]+1,t-1);

42         else

43         build(sum[i-1]+n/ctl[pos-1-i],t-1);

44     }

45     if(i != pos-1)

46     {

47         tree[rt].r = t ++;

48         if(n%ctl[pos-1-i] == 0)

49         build(sum[pos-2-i]+ctl[pos-1-i],t-1);

50         else

51         build(sum[pos-2-i]+n%ctl[pos-1-i],t-1);

52     }

53 }

54 void show(int x)

55 {

56     if(x == -1)

57     return ;

58     if(tree[x].l != -1)

59     printf("(");

60     show(tree[x].l);

61     if(tree[x].l != -1)

62     printf(")");

63     printf("X");

64     if(tree[x].r != -1)

65     printf("(");

66     show(tree[x].r);

67     if(tree[x].r != -1)

68     printf(")");

69 

70 }

71 int main()

72 {

73     int i;

74     LL n;

75     ctl[0] = 1;

76     ctl[1] = 1;

77     sum[1] = 1;

78     for(i = 2;i <= 20;i ++)

79     {

80         ctl[i] = ctl[i-1]*(4*i-2)/(i+1);

81         sum[i] = sum[i-1] + ctl[i];

82     }

83     while(cin>>n)

84     {

85         if(n == 0) break;

86         t = 2;

87         for(i = 1;i <= 200000;i ++)

88         tree[i].l = tree[i].r = -1;

89         build(n,1);

90         show(1);

91         printf("\n");

92     }

93     return 0;

94 }

 

 

你可能感兴趣的:(order)