计数(count)

题目描述

既然是萌萌哒 visit_world 的比赛,那必然会有一道计数题啦!

考虑一个 NN个节点的二叉树,它的节点被标上了 1∼N1∼N 的编号. 并且,编号为 ii的节点在二叉树的前序遍历中恰好是第ii个出现.

我们定义AiAi 表示编号为ii的点在二叉树的中序遍历中出现的位置.

现在,给出MM个限制条件,第ii个限制条件给出了ui,viui,vi,表示Aui<AviAui<Avi ,也即中序遍历中uiuivivi 之前出现.

你需要计算有多少种不同的带标号二叉树满足上述全部限制条件,答案对109+7109+7 取模.

输入

第一行一个整数 T(1≤T≤5)T(1≤T≤5), 表示数据组数.

每组数据第一行为两个整数 N,MN,M,意义如题目所述.

接下来 MM 行,每行两个整数ui,vi(1≤ui,vi≤N)ui,vi(1≤ui,vi≤N) . 描述一条限制.

输出

对每组数据,输出一行一个整数,表示答案.

样例输入

  1. 3
  2. 5 0
  3. 3 2
  4. 1 2
  5. 2 3
  6. 3 3
  7. 1 2
  8. 2 3
  9. 3 1

样例输出

  1. 1

提示

解释

第一组数据,无任何限制时,5 个点的二叉树形态个数为 4242 .

第二组数据,唯一满足条件的二叉树的形态为 1 - 2 - 3.(1 为根,2, 3 均为右儿子).

第三组数据,限制条件产生矛盾.

样例 2

见下发文件.

数据范围和子任务

对于全部的测试数据,保证 T≤5,N≤400,M≤103T≤5,N≤400,M≤103 .

子任务 1(20 分):M=0M=0 .

子任务 2(15 分):N≤10N≤10 .

子任务 3(20 分):N≤50,M≤1N≤50,M≤1 .

子任务 4(15 分):N≤50N≤50 .

子任务 5(30 分):无特殊限制.

来源

hnsdfz国庆集训day2


solution

20分是卡特兰数 然后我打崩了

令f[i][j]表示先序遍历序号为i~j的组成的树有多少种不同形态

那么 if(合法) f[i][j]=f[i+1][k]+f[k+1][j]

我们考虑怎么判断一个点是否合法

那么

1  [i+1,k]的任何一个点中序遍历都不能在[k+1,j] 以后

2  [i+1,k]的任何一个点中序遍历都不能在i以后

3  i的中序遍历都不能在[k+1,j] 以后

区间对区间可以用二维前缀和优化

效率O(n^3)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #define maxn 405
  8. #define mod 1000000007
  9. #define ll long long
  10. using namespace std;
  11. int T,n,m,t1,t2;
  12. ll f[maxn][maxn],s[maxn][maxn],a[maxn][maxn];
  13. void init(){
  14. for(int i=0;i<=400;i++)
  15. for(int j=0;j<=400;j++)f[i][j]=s[i][j]=a[i][j]=0;
  16. }
  17. int calc(int x,int y,int xx,int yy){
  18. return s[xx][yy]-s[xx][y-1]-s[x-1][yy]+s[x-1][y-1];
  19. }
  20. bool pd(int ii,int xa,int xb,int ya,int yb){
  21. if(calc(ya,xa,yb,xb))return 0;
  22. if(calc(ya,ii,yb,ii))return 0;
  23. if(calc(ii,xa,ii,xb))return 0;
  24. return 1;
  25. }
  26. int main()
  27. {
  28. cin>>T;
  29. while(T--){
  30. init();
  31. cin>>n>>m;
  32. for(int i=1;i<=m;i++){
  33. scanf("%d%d",&t1,&t2);
  34. a[t1][t2]=1;
  35. }
  36. for(int i=1;i<=n;i++){
  37. for(int j=1;j<=n;j++)s[i][j]=a[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  38. }
  39. for(int i=1;i<=n;i++)f[i][i]=1;
  40. for(int l=1;l<=n;l++){
  41. for(int i=1;i+l<=n;i++){
  42. int j=i+l;
  43. if(!calc(i,i+1,i,j))f[i][j]+=f[i+1][j];
  44. if(!calc(i+1,i,j,i))f[i][j]+=f[i+1][j];
  45. for(int k=i+1;k<j;k++){
  46. if(pd(i,i+1,k,k+1,j)){
  47. f[i][j]+=f[i+1][k]*f[k+1][j];
  48. }
  49. f[i][j]%=mod;
  50. }
  51. }
  52. }
  53. cout<<f[1][n]<<endl;
  54. }
  55. return 0;
  56. }

计数(count)的更多相关文章

  1. 如何使用 GroupBy 计数-Count()

    十年河东,十年河西,莫欺少年穷. 本节探讨的内容很简单,就是如果使用GroupBy计数 提供两种方法:第一:把查询的数据,转化为泛型,然后泛型分组计数. 第二:Linq语句直接分组计数 有如下范例: ...

  2. PHP切割字符用到的explode 以及计数count

    在thinkphp中同样可以用 explode来进行字符的切割工作,比如 $jihe='1,2,3,4'; 在使用explode之后,可以获得一个数组: $array=explode(',',$jih ...

  3. STL_算法_元素计数(count、count_if)

    C++ Primer 学习中.. . 简单记录下我的学习过程 (代码为主) count . count_if #include<iostream> #include<cstdio&g ...

  4. Table.RowCount行列计数…Count(Power Query 之 M 语言)

    数据源: 任意五行两列 目标: 计算行数(包括空行) 操作过程: [转换]>[对行进行计数] M公式:  = Table.RowCount( 表 ) 扩展: 对表中列进行计数:= Table.C ...

  5. sqlalchemy 获取计数 count

    from sqlalchemy import func message_count = self.db.query(func.count(Message.uid)).filter(Message.ui ...

  6. 序列计数(count)

    Portal -->broken qwq Description ​​  给你一个长度为\(n\)的序列,序列中的每个数都是不超过\(m\)的正整数,求满足以下两个条件的序列数量: 1.序列中至 ...

  7. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

  8. sum()over()和count()over()分析函数

    创建测试表 ),sales ),dest ),dept ),revenue number); 插入测试数据 ); ); ); ); ); ); ); commit; 查看表记录 SQL> sel ...

  9. select count(*) 底层究竟做了什么?

    阅读本文大概需要 6.6 分钟. SELECT COUNT( * ) FROM t是个再常见不过的 SQL 需求了.在 MySQL 的使用规范中,我们一般使用事务引擎 InnoDB 作为(一般业务)表 ...

随机推荐

  1. Ubuntu下安装pip3和Python的第三方库

    一.Ubuntu原有环境说明 无论是在服务器上面还是在我们自己的电脑上面,当我们成功安装了Ubuntu系统之后,系统一般情况下会自带Python2.x和Python3.x环境.比如我在自己的阿里云服务 ...

  2. IE脚本调试

    打开IE -- 工具 -- Internet选项 -- 高级 --有4项. 1.禁用脚本调试(Internet Explorer)(去掉对勾) 2.禁用脚本调试(其他)(去掉对勾) 3.显示每个脚本错 ...

  3. 如何修改魔兽争霸war3分辨率

    如何修改魔兽争霸war3 分辨率 有时候发现老电脑从XP系统升级到WIN7之后,发现玩魔兽不能全屏了(2边会有一些黑屏的).最后检查发现是魔兽在安装注册表之后显示的分辨率跟电脑的实际分辨率不同导致的. ...

  4. MySQL 5.7 在线启用和关闭GTID

    1.相关基础 MySQL 5.7.6之后GTID_MODE提供了两个新的选项分别为ON_PERMISSIVE和OFF_PERMISSIVEOFF_PERMISSIVE:不产生GTID事务, Slave ...

  5. Cannot read property 'tap' of undefined

    E:\vue-project\vue-element-admin-master>npm run build:prod vue-element-admin@3.8.1 build:prod E:\ ...

  6. python变量声明及简单数据类型

    一.python声明变量 变量的命名和使用 # 在Python中使用变量时,需要遵守一些规则和指南. # 违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解.请务必牢记下述有关变量的规则 ...

  7. JZOJ 1266. 玉米田

    1266. 玉米田(cowfood.pas/c/cpp) (File IO): input:cowfood.in output:cowfood.out Time Limits: 1000 ms  Me ...

  8. [基础学习]MySQL常用语句命令总结

    前言 相信平时大家在开发时都会使用MySQL数据库,它是目前比较火的一款数据库工具,对于大多数企业的业务来说,MySQL可以很完美地支持了. 很多时候我们都是借助mysql可视化工具操作mysql,虽 ...

  9. 20190102(多线程,守护线程,线程互斥锁,信号量,JoinableQueue)

    多线程 多进程: 核心是多道技术,本质上就是切换加保存技术. 当进程IO操作较多,可以提高程序效率. 每个进程都默认有一条主线程. 多线程: 程序的执行线路,相当于一条流水线,其包含了程序的具体执行步 ...

  10. 问题 B: 分组统计

    分组统计 问题 B: 分组统计时间限制: 1 Sec 内存限制: 32 MB 提交: 416 解决: 107 [提交][状态][讨论版][命题人:外部导入] 题目描述 先输入一组数,然后输入其分组,按 ...