题意:排序二叉树按照数插入的顺序不同会出现不同的结构,现在要在1~m选n个数,使按顺序插入形成的结构与给出的结构相同,有多少种选法。

解法:先将给出的结构插入,构造出一棵排序二叉树,再dfs统计,首先赋ans = C(m,n),从m个数中取n个数,然后将这n个数安排插入顺序,dfs,如果此时节点左右子树都有,那么其实左右子树的插入顺序可以相间,所有就是一个排列保持相对顺序不变地插入另一个保持相对顺序不变的序列中,有多少种插入方法呢,如果一个序列个数为k1,另一个为k2,那么方法数为:C(k1+k2,k1) = C(k1+k2,k2), 因为总共k1+k2个位置,我们从两个序列中选择k1或k2个位置,那么放入序列只有一种方式,那么其余的k2或k1个就定了。所以dfs求下去即可得出最后答案。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define SMod 1000003
#define ll long long
using namespace std; int C[][],Node;
int siz[],ch[][],val[];
ll ans; void Insert(int rt,int k) {
if(val[rt] == ) {
val[rt] = k;
siz[rt] = ;
ch[rt][] = ch[rt][] = ;
return;
}
if(k < val[rt]) { //left
if(ch[rt][] == ) ch[rt][] = ++Node;
Insert(ch[rt][],k);
}
else {
if(ch[rt][] == ) ch[rt][] = ++Node;
Insert(ch[rt][],k);
}
siz[rt] = siz[ch[rt][]]+siz[ch[rt][]]+;
return;
} void calc() {
C[][] = ;
for(int i = ; i < ; i++) {
C[i][] = ;
for(int j = ; j <= i; j++)
C[i][j] = (C[i - ][j] + C[i - ][j - ]) % SMod;
}
} void dfs(int u) {
if(ch[u][] && ch[u][]) {
int lsiz = siz[ch[u][]];
int rsiz = siz[ch[u][]];
//cout<<"l,rsiz = "<<lsiz<<" "<<rsiz<<endl;
ans = ans*C[lsiz+rsiz][lsiz]%SMod;
}
if(ch[u][]) dfs(ch[u][]);
if(ch[u][]) dfs(ch[u][]);
} int main()
{
int t,n,m,i,x;
calc();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
ans = (ll)C[m][n];
memset(val,,sizeof(val));
memset(siz,,sizeof(siz));
memset(ch,,sizeof(ch));
scanf("%d",&val[]);
Node = siz[] = ;
ch[][] = ch[][] = ;
for(i=;i<=n;i++) {
scanf("%d",&x);
Insert(,x);
}
dfs();
cout<<ans<<endl;
}
return ;
}

UVALive 5058 Counting BST --组合数的更多相关文章

  1. UVALive 5058 Counting BST 数学

    B - Counting BST Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...

  2. UVALive 3295 Counting Triangles

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  3. poj3046 Ant Counting——多重集组合数

    题目:http://poj.org/problem?id=3046 就是多重集组合数(分组背包优化): 从式子角度考虑:(干脆看这篇博客) https://blog.csdn.net/viphong/ ...

  4. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

  5. UVaLive 7143 Room Assignment (组合数+DP)

    题意:有 n 个客人,m个房间,每个房间可住ci个人,这 n 个人中有 t 对双胞胎,sum{ci}  = n 问你有多少种住房方法. 析:计数DP,dp[i][j] 表示前 i 个房间,还剩下 j ...

  6. UVaLive 6602 Counting Lattice Squares (找规律)

    题意:给定一个n*m的矩阵,问你里面有几面积为奇数的正方形. 析:首先能知道的是,大的矩阵是包括小的矩阵的,而且面积为奇数,我们只要考虑恰好在边界上的正方形即可,画几个看看就知道了,如果是3*3的有3 ...

  7. UVALive 6602 Counting Lattice Squares

    给定一个n*m的网格,求面积为奇数的正方形有多少个. 首先是n*m个面积为1的,然后剩下的要么是边长为奇数,要么被这样一个奇数边长所包围. 原因如下: 对于一个边长不平行于坐标抽的正方形,其边长一定是 ...

  8. UVALive 6527 Counting ones dfs(水

    题目链接:点击打开链接 #include <cstdio> #include <vector> using namespace std; typedef long long l ...

  9. Individual Contest #1 and Private Training #1

    第一次的增补赛,也是第一场个人排位赛,讲道理打的和屎一样,手速题卡了好久还WA了好多发,难题又切不出来,这种情况是最尴尬的吧! Individual Contest #1: Ploblem D: 题意 ...

随机推荐

  1. delphi 事件和属性的绑定

    TWindowState = (wsNormal, wsMinimized, wsMaximized); TScrollingWinControl = class(TWinControl) priva ...

  2. CSS3滚动条-webkit-scrollbar

    webkit现在支持拥有overflow属性的区域,列表框,下拉菜单,textarea的滚动条自定义样式. 如果你想跳过介绍,直接看demo的话,请点击demo 滚动条是一个伪元素,可以自定义样式.这 ...

  3. BP神经网络实现

    # -*- coding: utf-8 -*- # -------------------------------------------------------------------------- ...

  4. smarty访问数组中的数据,如果是关联数组直接用点.

    $tpl=new Smarty();//新建一个smarty对象,我使用的是Smarty-3.1.6版本 1.设置smarty模板路径$tpl->setTemplateDir():默认情况下是t ...

  5. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  6. Android 创建自己的Camera App

    在sdk中找到/sdk/docs/guide/topics/media/camera.html#custom-camera,里面有详细的api参考 在清单文件中添加相应的权限: <uses-pe ...

  7. Android 生成xml文件

    生成XML文件备份短信,其格式为: <?xml version="1.0" encoding="UTF-8" standalone="true& ...

  8. MySQL开启慢查询 总结

    MYSQL慢查询配置 1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? ...

  9. Amoeba for MySQL---分布式数据库Proxy解决方案

    Amoeba是什么? Amoeba(变形虫)项目,致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy ...

  10. HashSet vs TreeSet vs LinkedHashSet

    使用Set集合的主要原因是因为Set集合里面没有重复的元素.Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet.什么时候,选择哪一个使用非常重要.简单的说,如果你 ...