[UVALive5058] Counting BST && 计数DP + BST
2015-02-01 16:46
453 查看
先构造出BST 然后在上面进行统计即可 统计方法为
左子树方案数 * 右子树方案数 * C(当前位置为根节点总数, 左子树为根节点总数)
左子树方案数 * 右子树方案数 * C(当前位置为根节点总数, 左子树为根节点总数)
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<deque> #include<iostream> #define SF scanf #define PF printf using namespace std; typedef long long LL; const int MAXN = 1000; const int p = 1000003; int C[MAXN+10][MAXN+10]; void init() { C[0][0] = 1; for(int i = 1; i <= MAXN; i++) { C[i][0] = 1; for(int j = 1; j <= i; j++) C[i][j] = (C[i-1][j-1] + C[i-1][j]) % p; } } struct Binary_Search_Tree { int ch[MAXN+10][2], sz[MAXN+10], val[MAXN+10], ncnt, root; void init() { memset(ch, -1, sizeof(ch)); memset(sz, 0, sizeof(sz)); ncnt = 0; root = -1; } inline int SZ(int u) { if(u == -1) return 0; else return sz[u]; } inline void Update(int x) { sz[x] = SZ(ch[x][0]) + SZ(ch[x][1]) + 1; } void insert(int x, int u, int fa) { if(u == -1) { u = ++ncnt; sz[u] = 1; val[u] = x; if(root == -1) root = u; else ch[fa][x > val[fa]] = u; return ; } else { insert(x, ch[u][x > val[u]], u); Update(u); } } void insert(int x) { insert(x, root, -1); } int dfs(int u) { if(u == -1) return 1; int ans = ((LL)dfs(ch[u][0]) * dfs(ch[u][1])) % p; ans = ((LL) ans * C[SZ(ch[u][0])+SZ(ch[u][1])][SZ(ch[u][0])]) % p; return ans; } }BST; int main() { init(); int kase, T; SF("%d", &T); for(kase = 1; kase <= T; kase++) { int n, m; SF("%d%d", &n, &m); BST.init(); for(int i = 1; i <= n; i++) { int t; SF("%d", &t); BST.insert(t); } int ans = BST.dfs(BST.root); ans = ((LL) ans * C[m] ) % p; PF("%d\n", ans); } }
相关文章推荐
- [UVALive4864] Bit Counting && 数位DP
- [UVALive3675]Sorted bit sequence && 数位DP
- UVaLive 6801 Sequence (计数DP)
- UVALive - 4260 Fortune Card Game (DP&状态转移)好题
- UVALive 7271 A Math Problem 【数位dp计数】
- UVaLive 4847 - Binary Search Tree (与BST有关的计数问题)
- UVALive 6625 Diagrams & Tableaux (状态压缩DP)
- C - Permutation Counting UVALive - 5092 dp
- UVALive 3605 & ZOJ 3135 Roommate(DP)
- UVAlive - 4847(简单BST计数)
- UVALive 5004 Balanced Number && hdu-3967 Zero's Number(数位dp)
- DP->UVALive 4764
- HDOJ 3664 Permutation Counting / UVALive 5092 DP
- UVa 11795 - Mega Man's Mission(状态压缩dp)
- UVALive 2031 Dance Dance Revolution (舞步转移,状态压缩DP,4级)
- UVALive 3363 String Compression (区间DP,4级)
- UVAlive 6131 dp+斜率优化
- UVAlive 5875 DP
- UVALive 4625 Garlands(二分答案 + DP)
- UVa 111 History Grading (DP&LCS)