题意



N,K≤500,h[i]≤106N,K\le 500,h[i]\le10^6N,K≤500,h[i]≤106

题解

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

然后就可以随便DP了。

如果不会笛卡尔树,看看这张图,再看看代码就懂了(简单的笛卡尔树)。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 505;
const int mod = 1e9 + 7;
const int MAXV = 1000005;
int n, k, rt, ch[MAXN][2], h[MAXN], tot, sz[MAXN];
int f[MAXN][MAXN], fac[MAXV], inv[MAXV];
inline int C(int N, int M) { return N < M ? 0 : 1ll * fac[N] * inv[M] % mod * inv[N-M] % mod; }
void ins(int &x, int v) {
if(!x) { h[x = ++tot] = v, sz[x] = 1; return; }
if(v >= h[x]) ins(ch[x][1], v);
else ch[++tot][0] = x, x = tot, h[tot] = v;
sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
}
void dfs(int x, int ff) {
if(ch[x][0]) dfs(ch[x][0], x);
if(ch[x][1]) dfs(ch[x][1], x);
for(int i = 0; i <= sz[ch[x][0]]; ++i)
for(int j = 0; j <= sz[ch[x][1]]; ++j)
f[x][i+j] = (f[x][i+j] + 1ll * f[ch[x][0]][i] * f[ch[x][1]][j] % mod) % mod;
for(int i = sz[x]; i >= 0; --i)
for(int j = 1; j <= i && j <= h[x]-h[ff]; ++j)
f[x][i] = (f[x][i] + 1ll * f[x][i-j] * C(h[x]-h[ff], j) % mod * C(sz[x]-(i-j), j) % mod * fac[j] % mod) % mod;
}
int main () {
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for(int i = 2; i < MAXV; ++i) inv[i] = 1ll * (mod - mod/i) * inv[mod%i] % mod;
for(int i = 2; i < MAXV; ++i) fac[i] = 1ll * fac[i-1] * i % mod, inv[i] = 1ll * inv[i] * inv[i-1] % mod;
scanf("%d%d", &n, &k);
for(int i = 1, x; i <= n; ++i) scanf("%d", &x), ins(rt, x);
f[0][0] = 1;
dfs(rt, 0);
printf("%d\n", f[rt][k]);
}

BZOJ2616 SPOJ PERIODNI(笛卡尔树 + DP)的更多相关文章

  1. bzoj2616: SPOJ PERIODNI——笛卡尔树+DP

    不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...

  2. 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP

    [BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...

  3. BZOJ.2616.SPOJ PERIODNI(笛卡尔树 树形DP)

    BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. ...

  4. bzoj 2616 SPOJ PERIODNI——笛卡尔树+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2616 把相同高度的连续一段合成一个位置(可能不需要?),用前缀和维护宽度. 然后每次找区间里 ...

  5. 洛谷 P5044 - [IOI2018] meetings 会议(笛卡尔树+DP+线段树)

    洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) ...

  6. TopCoder 14084 BearPermutations2【笛卡尔树+dp】

    传送:https://vjudge.net/problem/TopCoder-14084 只是利用了笛卡尔树的性质,设f[i][j]为区间[i,j]的贡献,然后枚举中间最大的点k来转移,首先是两侧小区 ...

  7. BZOJ2616 SPOJ PERIODNI(笛卡尔树+树形dp)

    考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是 ...

  8. [BZOJ2616]SPOJ PERIODNI 树形dp+组合数+逆元

    2616: SPOJ PERIODNI Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 128  Solved: 48[Submit][Status][ ...

  9. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

随机推荐

  1. [转帖]商用数据库之死:Oracle 面临困境

    商用数据库之死:Oracle 面临困境 投递人 itwriter 发布于 2019-10-20 08:22 评论(1) 有238人阅读 原文链接 [收藏] « » https://news.cnblo ...

  2. python基础学习(十一)

    22.类 # 类 class # 实例 实体 instance class Student: # 空语句 保持结构的完整性 pass jack = Student() jack.name = &quo ...

  3. Ctex ERROR Reading

    提供一个"Ctex ERROR Reading"的处理办法 方法/步骤: 1. 再我们打开一些网上下载的文档的时候可能出现错误提示 2. 这种问题一般是文件编码的问题,我们需要选择 ...

  4. 计算机网络自顶向下方法第4章 网络层:数据平面 (Network layer)

    4.1 网络层概述  网络层主要功能为转发(将数据从路由器输入接口转移到合适的输出接口)和路由选择(端到端的路径选择),每台路由器都有一张转发表,用最长前缀匹配规则来转发. 4.1.1 转发和路由选择 ...

  5. Python——raise引发异常

    程序出现错误,会自动引发异常,Python也允许使用raise语句自行引发异常. 一.使用raise引发异常 单独一个raise引发异常,默认引发RuntimeError异常,例: try: prin ...

  6. go String接口方法

    该接口经常用于输出 struct 的值 或者记录struct数据日志 一个普遍存在的接口是 fmt 包中定义的 Stringer接口 发现 http://tour.studygolang.com/me ...

  7. Scratch编程:快乐的小马(三)

    “ 上节课的内容全部掌握了吗?反复练习了没有,编程最好的学习方法就是练习.练习.再练习.一定要记得多动手.多动脑筋哦~~” 01 — 游戏介绍 这是一款简单的小游戏,实现了一匹小马跑来跑去(小马有跑动 ...

  8. 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )

    原文:在论坛中出现的比较难的sql问题:33(递归 连续日期问题 ) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

  9. jQueryUI的widget的Hello World

    为了看懂jQuery-File-Upload里面的代码,所以学习到这里 //main.js //实践自定义jquery widget,风格1 (function($){ //$.widget('命名空 ...

  10. openssl 证书cert与key合并pfx

    openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt