解析

比较巧妙的一道题。
难点在于对题意的转化。

关键性质:符合要求的点等价于与笛卡尔树上深度为 mmm 的点。

原因也较为显然,考虑一个特定的点 xxx,当枚举全局最大值时,其会对 xxx 产生贡献,且最大值另一侧就和 xxx 没有关系了,向有 xxx 的一侧递归寻找最大值计算贡献,这个过程和笛卡尔树的构造是一样的。

问题就转化为了:给定一个二叉树,求第 mmm 层有 kkk 个节点的方案数。
这就是一个喜闻乐见的dp了。
设计状态 dpi,j,sdp_{i,j,s}dpi,j,s​ 表示子树根节点深度为 jjj,子树大小为 iii,且子树内有 sss 个好点的方案数。
就有转移:
fi,j,s=∑a=0i−1∑b=0a(i−1a)fa,j+1,b×fi−1−a,j+1,s−b−[j=m]f_{i,j,s}=\sum_{a=0}^{i-1}\sum_{b=0}^a\binom{i-1}{a}f_{a,j+1,b}\times f_{i-1-a,j+1,s-b-[j=m]}fi,j,s​=a=0∑i−1​b=0∑a​(ai−1​)fa,j+1,b​×fi−1−a,j+1,s−b−[j=m]​
直接做是 O(n5)O(n^5)O(n5) 的。
然后似乎也没有什么办法优化这个东西…于是就卡一卡常好了,调整一些变量的枚举上界,再直接让 fi,m,1=i!f_{i,m,1}=i!fi,m,1​=i!。
然后就能卡过去了,最慢的点 1.7s1.7 s1.7s。
(真不理解出题人为什么不能把范围改成 808080 之类的,这种东西比赛时就算想到了也很可能不敢写吧…)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=105;inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int mod;inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}int n,m,cnt;
ll c[N][N],jc[N];
void init(int n){c[0][0]=1;for(int i=1;i<=n;i++){c[i][0]=1;for(int j=1;j<=i;j++){c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}}jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;return;
}
ll f[N][N][N];signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();cnt=read();mod=read();init(n);for(int i=0;i<=n;i++) f[i][m][min(i,1)]=jc[i];for(int j=m-1;j>=1;j--){f[0][j][0]=1;for(int i=1;i+(j-1)<=n;i++){for(int k=0;k<=min(cnt,i);k++){for(int a=0;a<i;a++){for(int b=0;b==0||b+m-(j+1)<=a;b++){(f[i][j][k]+=f[a][j+1][b]*f[i-1-a][j+1][k-b]%mod*c[i-1][a])%=mod;//printf("(%d %d %d) -< (%d %d %d)*(%d %d %d) add=%lld\n",i,j,k,a,j+1,b,i-1-a,j+1,m-)}}}}}//for(int j=1;j<=m;j++){//    for(int i=0;i<=n;i++){//     for(int k=0;k<=cnt;k++) printf("siz=%d dep=%d num=%d f=%lld\n",i,j,k,f[i][j][k]);//    }//}printf("%lld\n",f[n][1][cnt]);return 0;
}
/*
*/

CF1580B Mathematics Curriculum(笛卡尔树、树形dp)相关推荐

  1. [XSY3383]多线程(笛卡尔树,DP)

    %%%tjytjytjy的笛卡尔树做法: 设dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)为把c[l],c[l+1],...,c[r]c[l], ...

  2. YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/4 题目大意 mmm个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci ...

  3. 【IOI2018】会议【笛卡尔树】【dp】【线段树】

    题意:长度为nnn的序列,qqq次询问,每次给定一个区间,钦定区间中的一个位置xxx,使得区间所有点 与xxx之间的最大值(含端点) 之和 最小,输出最小值. n,q≤7.5×105n,q\leq7. ...

  4. bzoj2616 SPOJ PERIODNI 笛卡尔树+DP

    题目分析 建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度. 设f(x,i)f(x,i)f(x,i)表示以xxx为跟的子树中放 ...

  5. P1377 [TJOI2011]树的序 笛卡尔树优化建树

    传送门 文章目录 题意: 思路: 题意: 给你一棵二叉树的生成序列,让你输出一个字典序最小的序列,使其生成的二叉树与原来的二叉树相同. 思路: 首先想到暴力建树,让后输出先序遍历即可,但是这样如果二叉 ...

  6. 技术情报局(笛卡尔树)

    problem 有这样一道简单题:给定一个序列求所有区间的最大值的和. 还有这样一道简单题:给定一个序列求所有区间的乘积的和. 众所周知:简单题 + 简单题 = 简单题. 所以,给定一个长为 nnn ...

  7. 笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

    文章目录 笛卡尔树 介绍 例题 Largest Submatrix of All 1's 应用 「POI2015」洗车 Myjnie [AGC028B] Removing Blocks SPOJ PE ...

  8. [集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

    传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)=pa,fB(1,n)=pbf_A(1,n)=p_a,f_B(1 ...

  9. 1220F - Gardener Alex(笛卡尔树)

    original link - http://codeforces.com/problemset/problem/1220/F 题意: 对出一个序列,你可以对其循环左移,问循环左移几次后,这个序列构造 ...

最新文章

  1. html导航栏重叠怎么办,请问前端大神,html如何引入另一个html,写了一个导航栏想在多个页面中如何重复使用?...
  2. Day 30: Play Framework —— Java开发者的梦想框架
  3. 如何分析 StackOverflow 异常 ?
  4. 测试或运维工作过程中最常用的几个linux命令?
  5. 手动爬虫之京东笔记本栏(ptyhon3)
  6. Java项目性能监控和调优工具-Javamelody
  7. iPhone开发知识和项目
  8. linux生成ssh密钥
  9. 台电 平板电脑 html,颜值与功能兼备 台电X6 Pro二合一平板评测
  10. AWVS12-Windows
  11. 数据库基本操作和常用命令
  12. uniapp h5 微信打开双标题处理
  13. 使用Python2.7批量查询云窗IP
  14. 5W字穿透 ELK(史上最全):elasticsearch +logstash+kibana
  15. winform图片标尺控件
  16. Vue-Router学习记录
  17. Python函数设计与使用
  18. 嵌入式C设计模式---工厂设计模式
  19. 【程序设计】暴力枚举
  20. 7000 字梳理 RocketMq

热门文章

  1. 现在的便签本都这么社会了!?重复写万次还能云端保存
  2. 使用aconda3-5.1.0(Python3.6.4) 搭建pyspark远程部署
  3. java当前时间推前三个月_获取当前时间的前三个月 java
  4. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  5. matlab菲涅尔衍射_有问必答——SYNOPSYS安装体验课堂——可以设计菲涅尔透镜吗?...
  6. 名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释
  7. linux 信号_Linux中的信号处理机制 [四]
  8. php 单例模式的类,用单例模式来设计一个PHP数据库类
  9. lighttpd mysql_lighttpd+mysql+php
  10. node.js require 自动执行脚本 并生成html,nodejs 执行脚本并实时输出