您的位置:首页 > 其它

[UVALive5058] Counting BST && 计数DP + BST

2015-02-01 16:46 453 查看
先构造出BST 然后在上面进行统计即可 统计方法为

左子树方案数 * 右子树方案数 * 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);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: