bzoj2616 SPOJ PERIODNI 笛卡尔树+DP
题目分析
建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度。
设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=0if(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=1iChx−hfa(x)jCsz(x)−(i−j)jj!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相关推荐
- 笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)
文章目录 笛卡尔树 介绍 例题 Largest Submatrix of All 1's 应用 「POI2015」洗车 Myjnie [AGC028B] Removing Blocks SPOJ PE ...
- 【IOI2018】会议【笛卡尔树】【dp】【线段树】
题意:长度为nnn的序列,qqq次询问,每次给定一个区间,钦定区间中的一个位置xxx,使得区间所有点 与xxx之间的最大值(含端点) 之和 最小,输出最小值. n,q≤7.5×105n,q\leq7. ...
- CF1580B Mathematics Curriculum(笛卡尔树、树形dp)
解析 比较巧妙的一道题. 难点在于对题意的转化. 关键性质:符合要求的点等价于与笛卡尔树上深度为 mmm 的点. 原因也较为显然,考虑一个特定的点 xxx,当枚举全局最大值时,其会对 xxx 产生贡献 ...
- [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], ...
- 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 ...
- [BZOJ2616] SPOJ PERIODNI
[BZOJ2616] SPOJ PERIODNI 题目描述 Solution 这题有个高大上的名字--笛卡尔树DPDPDP. 然而其实就是一个简单的区间DP而已. 设fl,r,jf_{l,r,j}fl ...
- P1377 [TJOI2011]树的序 笛卡尔树优化建树
传送门 文章目录 题意: 思路: 题意: 给你一棵二叉树的生成序列,让你输出一个字典序最小的序列,使其生成的二叉树与原来的二叉树相同. 思路: 首先想到暴力建树,让后输出先序遍历即可,但是这样如果二叉 ...
- [集训队作业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 ...
- 1220F - Gardener Alex(笛卡尔树)
original link - http://codeforces.com/problemset/problem/1220/F 题意: 对出一个序列,你可以对其循环左移,问循环左移几次后,这个序列构造 ...
最新文章
- 手动创建DataTable
- POJ 3608 旋转卡壳
- android滑动开关框架,Android之实现滑动开关组件
- 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统(附源码+视频教程(第6节))...
- Jeewx-Boot 1.2 小程序官网模块发布,免费开源的微信管家平台
- 题目1008:最短路径问题(SPFA算法)
- Silverlight中Shape,Geometry
- 深度学习与计算机视觉教程(5) | 卷积神经网络(CV通关指南·完结)
- html给字体设置大小,如何设置html字体大小
- http://hi.baidu.com/%BE%C5%CC%EC%C4%A7%CA%DE/blog/item/9b3263626a75ff49ebf8f808.html
- 导出mysql某个表数据_mysql数据库导出指定表数据的方法
- 从PLC ,PAC ,到施耐德的自动化开放系统
- SDN网络的本质特点
- 内存走线 菊花链_[转帖]关于DDR4内存颗粒、单双面、主板布线和双通道的那些事儿...
- mac m1 网络卡顿问题(微信有网浏览器没网)
- 从 Eligibility 浅谈英中翻译消除歧义的重要性
- VS2012中--查找定义后从未被使用的函数
- 网站中加入站长流量统计代码
- 2021年1--3月日历带农历天干地支
- MySQL数据库的约束