题目传送门:LOJ #2567

题意简述:

有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数,也可以填 \(0\)。

如果第 \(i\) 个位置填了非 \(0\) 的数,则这个数必须大于之前所有位置(\(1\) 到 \(i-1\) 的位置)上的数。

至少要有一个位置填上非 \(0\) 的数。问最终有几种填数方案,两种填数方案不同当且仅当某个位置上填的数不同。

题解:

要求即为选出一些位置填数,并且形成严格递增序列。

发现把所有区间离散化,可以组成 \(\mathcal{O}(n)\) 个连续段,每个连续段中的数的性质是相同的。

因为 \(n\) 不大(只有 \(500\)),考虑 DP。令 \(\mathrm{f}[i][j]\) 表示前 \(i\) 个位置,第 \(i\) 个位置填了在段 \(j\) 中的数的方案数。

显然若 \([a_i,b_i]\) 不包含段 \(j\),则 \(\mathrm{f}[i][j]=0\)。对于其他的情况,考虑如何转移,假设上一个填了在小于 \(j\) 的段中的数的位置是 \(k\),则有 \(\mathrm{f}[i][j]\) 从 \(\mathrm{f}[k][j']\) 转移,其中 \(0\le k<i\) 且 \(1\le j'<j\)。

转移的具体形式是:假设位置 \((k,i]\) 中一共有 \(pos\) 个位置(包括 \(i\) 本身)包含段 \(j\),而段 \(j\) 的长度为 \(len\),则 \(\mathrm{f}[k][j']\) 贡献 \(\displaystyle\sum_{x=1}^{pos}\binom{pos-1}{x-1}\binom{len}{x}\) 倍给 \(\mathrm{f}[i][j]\)。这是因为我们枚举 \(pos\) 个位置中填了 \(x\) 个位置,但是第 \(i\) 个位置必须填,所以乘上 \(\displaystyle\binom{pos-1}{x-1}\),然后 \(len\) 个可行数中选出 \(x\) 个从小到大依次填入,所以再乘上 \(\displaystyle\binom{len}{x}\)。化简一下系数:\(\displaystyle\sum_{x=1}^{pos}\binom{pos-1}{x-1}\binom{len}{x}=\sum_{x}\binom{len}{x}\binom{pos-1}{pos-x}=\binom{len+pos-1}{pos}\)。式子可以这样理解:枚举 \(x\),从 \(len\) 个数中选出 \(x\) 个数,再从 \(pos-1\) 个数中选出 \(pos-x\) 个数,这与直接从 \(len+pos-1\) 个数中选出 \(pos\) 个数等价。

那么我们有 \(\displaystyle\mathrm{f}[i][j]=\sum_{k=0}^{i-1}\binom{len+pos-1}{pos}\sum_{j'=0}^{j-1}\mathrm{f}[k][j']\)。边界是 \(\mathrm{f}[0][0]=1\)、\(\mathrm{f}[0][j]=0\)(\(1\le j\))和 \(\mathrm{f}[i][0]=0\)(\(1\le i\))。

再利用前缀和优化,把第二维做前缀和,把转移变成 \(\mathcal{O}(n)\) 的就好了,转移内的组合数可以 \(\mathcal{O}(n)\) 预处理。

还可以滚动数组一下,空间就是 \(\mathcal{O}(n)\) 的了,不过没必要。

#include <cstdio>
#include <algorithm> typedef long long LL;
const int Mod = 1000000007;
const int MN = 505; int N, lb[MN], rb[MN], lp[MN * 2], len[MN * 2], cnt;
int Inv[MN], C[MN], f[MN], Ans; int main() {
scanf("%d", &N);
for (int i = 1; i <= N; ++i)
scanf("%d%d", &lb[i], &rb[i]),
lp[++cnt] = lb[i],
lp[++cnt] = rb[i] + 1;
std::sort(lp + 1, lp + cnt + 1);
cnt = std::unique(lp + 1, lp + cnt + 1) - lp - 2;
for (int i = 1; i <= cnt; ++i) len[i] = lp[i + 1] - lp[i];
for (int i = 1; i <= N; ++i)
lb[i] = std::lower_bound(lp + 1, lp + cnt + 1, lb[i]) - lp,
rb[i] = std::lower_bound(lp + 1, lp + cnt + 1, rb[i] + 1) - lp - 1;
Inv[1] = 1, C[0] = 1, f[0] = 1;
for (int i = 2; i <= N; ++i) Inv[i] = (LL)(Mod - Mod / i) * Inv[Mod % i] % Mod;
for (int i = 1; i <= cnt; ++i) {
int l = len[i];
for (int j = 1; j <= N; ++j)
C[j] = (LL)C[j - 1] * (l + j - 1) % Mod * Inv[j] % Mod;
for (int j = N; j >= 1; --j) if (lb[j] <= i && i <= rb[j]) {
for (int k = j, a = 0; k >= 1; --k) {
if (lb[k] <= i && i <= rb[k]) ++a;
f[j] = (f[j] + (LL)f[k - 1] * C[a]) % Mod;
}
}
}
for (int i = 1; i <= N; ++i) Ans = (Ans + f[i]) % Mod;
printf("%d\n", Ans);
return 0;
}

LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇的更多相关文章

  1. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

  2. LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票

    题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...

  3. 洛谷 8 月月赛 & 「PMOI」Round · 04

    T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...

  4. 【LOJ】#2567. 「APIO2016」划艇

    题解 显然有个很暴力的dp,\(dp[i][j]\)表示选到第\(i\)个数,末尾的数是\(j\)的方案数 但是第二维就开不下了,怎么办呢 考虑离散化整个区间,我们记录\(dp[i][j][k]\)表 ...

  5. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  6. 「APIO2016」烟花表演

    「APIO2016」烟花表演 解题思路 又是一道 solpe trick 题,观察出图像变化后不找一些性质还是挺难做的. 首先令 \(dp[u][i]\) 为节点 \(u\) 极其子树所有叶子到 \( ...

  7. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想

    题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...

  8. 洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树

    一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一. 题目传送门:洛谷P5206. 题意简述: 给定 \(n, y\). 一张图有 \(|V| = n\) 个点.对于两棵树 \ ...

  9. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

随机推荐

  1. SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)

    上个示例(SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API))是基于JavaScript,运行在web browser内去访问REST AP ...

  2. numpy 从入门到遗忘

    不常用的函数总是遗忘,很是困扰啊.于是痛下时间,做一个系统的总结,纯原创,都是些实际项目中常用的函数和方法,当然还有一些这边也是没有记录的,因为我在实际数据处理过程中也没有遇到过(如字符串处理等等). ...

  3. JDK源码分析(2)LinkedList

    JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...

  4. SDL_BlitSurface

    SDL_BlitSurface Use this function to perform a fast surface copy to a destination surface. Contents ...

  5. 决策单调性优化dp

    决策单调性: 对于一些dp方程,经过一系列的猜想和证明,可以得出,所有取的最优解的转移点(即决策点)位置是单调递增的. 即:假设f[i]=min(f[j]+b[j]) (j<i) 并且,对于任意 ...

  6. P1339 热浪 最短路径模板题

    这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. #include <cstdio> #include <cstring ...

  7. c 的内存分配与释放原则: 通常应遵循“谁malloc,谁free”的原则。

    通常应遵循“谁malloc,谁free”的原则. ------------------------   一位大神的话. 2013-02-09

  8. typescript泛型(学习笔记非干货)

    软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型, 这在创建大型系统时为你提供了十分灵活的功能. In softwa ...

  9. poj 3320(尺取法)

    传送门:Problem 3320 参考资料: [1]:挑战程序设计竞赛 题意: 一本书有 P 页,每页都有个知识点a[i],知识点可能重复,求包含所有知识点的最少的页数. 题解: 相关说明: 设以a[ ...

  10. 使用博客系统发生_STORAGE_WRITE_ERROR_错误

    因为本人有自己的vps正好又最近学习了网络的搭建,但是呢不是一番风顺的在假设好PHP.http和MySQL后吧一个博客系统放进去后出现了以下问题 好吧== 出来了这个问题到是让我看了半天,然后查了查说 ...