传送门

  • 题目:

    给出一个数列,由该数列可以确定一颗二叉搜索树。求此二叉搜索树可以由多少个不同的数列确定。树上最多有100个结点。
  • 解题思路:
    100个结点可能出现极端情况(链式,100层),不能用数组存,考虑动态开点用指针存储 , 记得清空树,回收空间
    当前结点t,递推式:ans[t]=ans[lt]∗ans[rt]∗Csize[t]−1size[lt]ans[t]=ans[lt]*ans[rt]*C_{size[t]-1}^{size[lt]}ans[t]=ans[lt]∗ans[rt]∗Csize[t]−1size[lt]​其中ans[t]ans[t]ans[t]表示结点t对应的子树(二叉搜索树)能有ans[t]ans[t]ans[t]个不同的数列确定;
    size[t]size[t]size[t]表示结点t对应的子树大小(包括t本身);
    在数列中结点t肯定是第一个,在产生左子树和右子树的数列已经确定的前提下,剩余的size[t]−1size[t]-1size[t]−1个位置中有size[lt]size[lt]size[lt]个放左子树中的元素,剩余的放右子树中的元素。
    这里数据比较小,Csize[t]−1size[lt]C_{size[t]-1}^{size[lt]}Csize[t]−1size[lt]​可以不用Lucas求。(主要是为了复习下lucas定理的写法)
  • ac代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
const ll mod = 9901;
const int maxn = 110;
int n, a[maxn];
struct node{node *l, *r;int v, Size;node(){l=r=NULL, v=Size=0;}
}b[110];//node *root;
void insert(int v)
{//printf("%d\n", v);node *t = root;while(t->Size>0){t->Size++;if(v<=t->v){if(t->l==NULL) t->l = new node();t = t->l;//printf("l%d\n", t->v);}else{if(t->r==NULL) t->r = new node();t = t->r;//printf("r%d\n", t->v);}}t->v = v; t->Size = 1;
}
void del(node *t)
{if(t->l!=NULL) del(t->l);if(t->r!=NULL) del(t->r);//printf("%d\n", t->v);delete(t);
}
ll mul(ll a, ll b) {return (a%mod)*(b%mod)%mod;}
ll qpow(ll a, ll b)
{ll res = 1; a%=mod;while(b){if(b&1) res = mul(res, a);a = mul(a, a);b>>=1;}return res;
}
ll com(ll a, ll b)//Ca^b
{//printf("%lld %lld\n", a, b);if(a<b) return 0;if(b==0 || a==b) return 1;b = min(b, a-b);ll ca = 1, cb = 1;for(int i = 0; i < b; i++){ca = mul(ca, a-i);cb = mul(cb, i+1);}return  mul(ca, qpow(cb, mod-2));
}
ll lucas(ll a, ll b)
{if(b==0) return 1;return com(a%mod, b%mod)*lucas(a/mod, b/mod)%mod;
}
ll dfs(node *t)
{if(t==NULL) return 1;//printf("%d %d %d %d \n", t->l==NULL?0:t->l->v, t->r==NULL?0:t->r->v, t->v, t->Size);return mul(mul(dfs(t->l), dfs(t->r)), lucas(t->Size-1, t->l==NULL?0:t->l->Size));
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d", &n) && n){for(int i = 1; i <= n; i++) scanf("%d", &a[i]);root = new node();root->v = a[1]; root->Size = 1;for(int i = 2; i <= n; i++) insert(a[i]);printf("%lld\n", dfs(root));del(root);}return 0;
}

【POJ2775】The Number of the Same BST(二叉搜索树+计数+lucas定理)相关推荐

  1. BST二叉搜索树插入节点建树并找出不平衡节点,networkx,Python

    BST二叉搜索树插入节点建树并找出失衡节点,networkx,Python import randomfrom matplotlib import pyplot as plt import netwo ...

  2. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  3. CS61B -BST(二叉搜索树)

    CS61B - BST 什么是BST BST全名Binary search tree(二叉搜索树) BST的基本性质 BST可以是一棵空树 如果它的左树不为空,那么左树中的所有节点的值都小于根节点的值 ...

  4. BST 二叉搜索树 (动态建树与静态建树)

    //判断两棵树是否是同一棵树:先序遍历和中序遍历对应相同或者中序遍历和后序遍历对应相同 //代码思路:两个数组分别存放建好的树的先序遍历以及正序遍历结果,然后对比是否相等 //题目意思 这题是 HDU ...

  5. 在BST(二叉搜索树)中查找介于给定范围之内的值

    一.题目要求 编写一个递归函数printRange(),传入一个BST.一个较小的值和一个较大的值,按照顺序打印出介于两个值之间的所有结点.函数printRange()应尽可能少地访问BST的结点.( ...

  6. (一)BST树(二叉搜索树)

    (一)BST树(二叉搜索树) 1.BST二叉搜索树 1.1BST树的定义 1 BST树也是一个二叉树,故满足递归定义; 2 其次每个节点只存在一个值; 3 需满足左子树值<=根值<=右子树 ...

  7. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  8. 二叉搜索树BST红黑树

    二叉搜索树基础知识 提起红黑树咱们肯定要先说说这个二叉搜索树(BST) 二叉搜索树又叫二叉查找树,二叉排序树:它具有以下特点: 如果它的左子树不为空,则左子树上结点的值都小于根结点. 如果它的右子树不 ...

  9. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  10. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

最新文章

  1. 3d旋转相册代码源码_实现可旋转的Reflection Probe(原创)
  2. CLOUD 04:zookeeper,kafka,hadoop高可用
  3. 【树莓派编程】检测有没有物体移动 +人脸识别
  4. 第二阶段—个人工作总结03
  5. python为text添加滚动条_Python GUI编程(Tkinter)7、带滚动条的Text
  6. Python 学习拾遗
  7. 表示数值的字符串(有限状态自动机与搜索)
  8. oracle 自治事物,自治事务 - 努力创造未来! - BlogJava
  9. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 (以后在写SQL时,要有这种思想!!!)
  10. elasticsearch 主键字段_ElasticSearch 索引 VS MySQL 索引
  11. IIS asp.net 4.0
  12. 网易互娱-后台开发(支付方向)二面
  13. Java计算同比环比
  14. Linux实验13_进程管理及任务计划.docx
  15. 依然仰望星空,脚踏实地——个人CSDN年度总结。
  16. Pycon 2017: Python可视化库大全
  17. iPad作为Windows电脑副屏使用技巧(详细向)
  18. python之AQI分析与预测
  19. 小白学编程(CSS):跳动的文字
  20. Linux 7 提示 -bash: ifconfig: command not found

热门文章

  1. [Share]如何做好一份前端工程师的简历?
  2. Flash与后台数据交互方法总结
  3. 物联网培训总结(C#)
  4. java编写api取数据_Java 8 API 示例:字符串、数值、算术和文件
  5. beetl html模板,Spring Boot 2 中使用 beetl 模板引擎
  6. linux部署rabbit mq,Linux安装rabbitmq遇到的问题
  7. html常用代码大全_电子元器件知识资料大全
  8. [摘抄]从 GitHub 身上学到的 3 个创业经验
  9. Maven查看依赖树
  10. MySQLl数据量不一样,导致走不同的索引