中间计算的各种细节。有的细节没处理好,就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(" "); 92 } 93 return 0; 94 }