题目分析

建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度。

设f(x,i)f(x,i)f(x,i)表示以xxx为跟的子树中放了iii个棋子的方案数。

初始值:f(0,0)=1f(0,0)=1f(0,0)=1

首先求出不在xxx的矩形中放棋子的方案数:f(x,i)=∑j=0if(ls(x),j)f(rs(x),i−j)f(x,i)=\sum_{j=0}^i f(ls(x),j)f(rs(x),i-j)f(x,i)=∑j=0i​f(ls(x),j)f(rs(x),i−j)

然后处理在xxx的矩形中放棋子的方案数:f(x,i)+=∑j=1iChx−hfa(x)jCsz(x)−(i−j)jj!f(x,i−j)f(x,i)+=\sum_{j=1}^{i}C_{h_x-h_{fa(x)}}^jC_{sz(x)-(i-j)}^j j! f(x,i-j)f(x,i)+=∑j=1i​Chx​−hfa(x)​j​Csz(x)−(i−j)j​j!f(x,i−j)

代码

#include<bits/stdc++.h>
using namespace std;
#define RI register int
const int mod=1000000007,N=505,M=1000000;
int n,K,SZ,rt;
int h[N],sz[N],s[N][2],f[N][N],fac[M+5],inv[M+5],ifac[M+5];int qm(int x) {return x>=mod?x-mod:x;}
int C(int d,int u) {return 1LL*fac[d]*ifac[u]%mod*ifac[d-u]%mod;}
void ins(int &x,int v) {if(!x) {x=++SZ,h[x]=v,sz[x]=1;return;}if(v>=h[x]) ins(s[x][1],v);else ++SZ,s[SZ][0]=x,x=SZ,h[x]=v;sz[x]=sz[s[x][0]]+sz[s[x][1]]+1;
}
void DP(int x,int las) {if(s[x][0]) DP(s[x][0],x);if(s[x][1]) DP(s[x][1],x);for(RI i=0;i<=sz[s[x][0]];++i)for(RI j=0;j<=sz[s[x][1]];++j)f[x][i+j]=qm(f[x][i+j]+1LL*f[s[x][0]][i]*f[s[x][1]][j]%mod);for(RI i=sz[x];i>=1;--i)for(RI j=1;j<=i&&j<=h[x]-h[las];++j)f[x][i]=qm(f[x][i]+1LL*C(h[x]-h[las],j)*C(sz[x]-i+j,j)%mod*fac[j]%mod*f[x][i-j]%mod);
}int main()
{int x;scanf("%d%d",&n,&K);fac[0]=1;for(RI i=1;i<=M;++i) fac[i]=1LL*fac[i-1]*i%mod;inv[0]=inv[1]=1,ifac[0]=1;for(RI i=2;i<=M;++i) inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;for(RI i=1;i<=M;++i) ifac[i]=1LL*ifac[i-1]*inv[i]%mod;for(RI i=1;i<=n;++i) scanf("%d",&x),ins(rt,x);f[0][0]=1,DP(rt,0);printf("%d\n",f[rt][K]);return 0;
}

bzoj2616 SPOJ PERIODNI 笛卡尔树+DP相关推荐

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

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

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

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

  3. CF1580B Mathematics Curriculum(笛卡尔树、树形dp)

    解析 比较巧妙的一道题. 难点在于对题意的转化. 关键性质:符合要求的点等价于与笛卡尔树上深度为 mmm 的点. 原因也较为显然,考虑一个特定的点 xxx,当枚举全局最大值时,其会对 xxx 产生贡献 ...

  4. [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], ...

  5. 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 ...

  6. [BZOJ2616] SPOJ PERIODNI

    [BZOJ2616] SPOJ PERIODNI 题目描述 Solution 这题有个高大上的名字--笛卡尔树DPDPDP. 然而其实就是一个简单的区间DP而已. 设fl,r,jf_{l,r,j}fl ...

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

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

  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. 手动创建DataTable
  2. POJ 3608 旋转卡壳
  3. android滑动开关框架,Android之实现滑动开关组件
  4. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统(附源码+视频教程(第6节))...
  5. Jeewx-Boot 1.2 小程序官网模块发布,免费开源的微信管家平台
  6. 题目1008:最短路径问题(SPFA算法)
  7. Silverlight中Shape,Geometry
  8. 深度学习与计算机视觉教程(5) | 卷积神经网络(CV通关指南·完结)
  9. html给字体设置大小,如何设置html字体大小
  10. http://hi.baidu.com/%BE%C5%CC%EC%C4%A7%CA%DE/blog/item/9b3263626a75ff49ebf8f808.html
  11. 导出mysql某个表数据_mysql数据库导出指定表数据的方法
  12. 从PLC ,PAC ,到施耐德的自动化开放系统
  13. SDN网络的本质特点
  14. 内存走线 菊花链_[转帖]关于DDR4内存颗粒、单双面、主板布线和双通道的那些事儿...
  15. mac m1 网络卡顿问题(微信有网浏览器没网)
  16. 从 Eligibility 浅谈英中翻译消除歧义的重要性
  17. VS2012中--查找定义后从未被使用的函数
  18. 网站中加入站长流量统计代码
  19. 2021年1--3月日历带农历天干地支
  20. MySQL数据库的约束

热门文章

  1. 区块链系统架构图_区块链模型架构
  2. js判断对象类型的两种方法
  3. rp软件app流程图_app开发流程图_app的制作流程图
  4. 为大家整合一下2013-2019年的百度算法
  5. 什么是人们常用的计算机设备之一,2012全国计算机一级考试一级B样题
  6. 愣头青法学习openstack——零基础学习openstack的建议
  7. 程序学3DMax之自动展UV
  8. 91云服务器,GitHub - 91yun/91yuntest: 91云服务器一键测试包
  9. dll修复工具哪个比较好?修复工具介绍
  10. 《南京零距离》主持人孟非的打拼故事