[BZOJ2616]SPOJ PERIODNI 树形dp+组合数+逆元
2616: SPOJ PERIODNI
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 128 Solved: 48
[Submit][Status][Discuss]
Description
.jpg)
Input
第1行包括两个正整数N,K,表示了棋盘的列数和放的车数。
第2行包含N个正整数,表示了棋盘每列的高度。
Output
包括一个非负整数,表示有多少种放置的方案,输出答案mod
1000000007后的结果即可。
Sample Input
2 3 1 2 4
Sample Output
HINT
对于100%的数据,有 N≤500,K≤500,h[i] ≤1000000。
Source
我们可以先构造笛卡尔树(每次找最低点分为两半)
之后设f[i][j]表示以i为根的子树共放了j个的方案数。
每次dp时我们处理g[i]表示左右子树共放了i个的方案数。
长为n,宽为m的矩阵放k个车的方案数为C(n,k)*A(m,k)
依据这个每次枚举g[i]转移f即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define LL long long
#define mod 1000000007
using namespace std;
LL n,k;
LL g[],a[];
LL f[][];
LL p[],inv[];
LL cal(LL x,LL y,LL k){
if(x<k||y<k)return ;
return p[x]*inv[x-k]%mod*inv[k]%mod*p[y]%mod*inv[y-k]%mod;
}
LL dp(int l,int r,int h) {
if(l>r) return ;
int lowi=l;
for(int i=l;i<=r;i++) if(a[lowi]>a[i]) lowi=i;
int la=dp(l,lowi-,a[lowi]),ra=dp(lowi+,r,a[lowi]);
memset(g,,sizeof(g));
for(int i=;i<=lowi-l;i++)
for(int j=;j<=r-lowi;j++) g[i+j]=(g[i+j]+f[la][i]*f[ra][j])%mod;
for(int i=;i<=r-l+;i++)
for(int j=;j<=i;j++)
f[lowi][i]=(f[lowi][i]+g[j]*cal(r-l+-j,a[lowi]-h,i-j))%mod;
return lowi;
}
LL power(LL x,LL ad) {
LL ans=;
while(ad) {
if(ad&) ans=ans*x%mod;
x=x*x%mod;
ad>>=;
}
return ans;
}
int main() {
p[]=;
for(int i=;i<=;i++) p[i]=p[i-]*i%mod;
inv[]=power(p[],mod-);
for(int i=-;i>=;i--)inv[i]=inv[i+]*(i+)%mod;
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
f[][]=;
printf("%lld\n",f[dp(,n,)][k]);
}
[BZOJ2616]SPOJ PERIODNI 树形dp+组合数+逆元的更多相关文章
- BZOJ2616 SPOJ PERIODNI(笛卡尔树+树形dp)
考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- bzoj2616: SPOJ PERIODNI——笛卡尔树+DP
不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...
- BZOJ2616 SPOJ PERIODNI(笛卡尔树 + DP)
题意 N,K≤500,h[i]≤106N,K\le 500,h[i]\le10^6N,K≤500,h[i]≤106 题解 建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高 ...
- BZOJ2616 : SPOJ PERIODNI
长为$A$,宽为$B$的矩阵放$K$个车的方案数$=C(A,K)\times C(B,K)\times K!$. 建立笛卡尔树,那么左右儿子独立,设$f[i][j]$表示$i$子树内放$j$个车的方案 ...
- [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 218 Solved: 171[Submit][Statu ...
- 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP
[BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- SPOJ 1435 - Vertex Cover(树形DP,树的最小点覆盖)
算是个经典题目了,很模板的树形DP题目 做这个题的时候一开始就想到树形DP了,可是由于各种原因没写出来,代码太糟烂了,赛后还是改了好久才过的 dp(u,0)=sum(dp(v,1)): dp(u,1) ...
随机推荐
- Tree Constructing CodeForces - 1003E(构造)
题意: 就是让构造一个直径为d的树 每个结点的度数不能超过k 解析: 先构造出一条直径为d的树枝 然后去遍历这条树枝上的每个点 为每个点在不超过度数和直径的条件下添加子嗣即可 #include & ...
- 【刷题】BZOJ 4391 [Usaco2015 dec]High Card Low Card
Description Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of ...
- 洛谷 P1993 小K的农场 解题报告
P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b ...
- 【codeforces 666E】 Forensic Examination
http://codeforces.com/problemset/problem/666/E (题目链接) 题意 给出一个主串$S$,$n$个匹配串编号从$1$到$n$.$m$组询问,每次询问主串的一 ...
- 六、spring boot 1.5.4 配置多数据源
spring boot 已经支持多数据源配置了,无需网上好多那些编写什么类的,特别麻烦,看看如下解决方案,官方的,放心! 1.首先定义数据源配置 #=====================multi ...
- Codeforces Round #541
因为这次难得不在十点半(或是更晚),大家都在打,然后我又双叒叕垫底了=.= 自己对时间的分配,做题的方法和心态还是太蒻了,写的时候经常写一半推倒重来.还有也许不是自己写不出来,而是在开始写之前就觉得自 ...
- python---django中自带分页类使用
请先看在学习tornado时,写的自定义分页类:思路一致: python---自定义分页类 1.基础使用: 后台数据获取: from django.core.paginator import Pagi ...
- 【Linux】MySQL安装及允许远程访问
安装环境/工具 Linux( centOS 版) MySQL(MySQL-5.6.28-1.el7.x86_64.rpm-bundle.tar版) 安装步骤 1.解压mysql安装文件 命令:tar ...
- 利用requestAnimationFrame和Tween算法实现兼容所有浏览器的运动动画,直接秒杀Css3动画
以下贴出Tween的代码: /* * Tween.js * t: current time(当前时间): * b: beginning value(初始值): * c: change in value ...
- java7,java8 中HashMap和ConcurrentHashMap简介
一:Java7 中的HashMap 结构: HashMap 里面是一个数组,然后数组中每个元素是一个单向链表.链表中每个元素称为一个Entry 实例,Entry 包含四个属性:key, value, ...