正题

题目链接:https://www.luogu.com.cn/problem/P3643


题目大意

求有多少个\(n\)个数的序列\(x\)满足,\(x_i\in \{0\}\cup[a_i,b_i]\)且非\(0\)数递增。


解题思路

会发现\(a_i,b_i\)很大不能太暴力的将第二维的\(dp\)设为上一个选了的数是多少。

可以考虑离散化,会将整个数轴分成最多\(2n-1\)个区间,但是这样我们就不能确定上个数字具体在哪里了。\(n\)比较小,所以我们可以考虑一种比较合理的方法就先确定这个区间中有多少个数然后再用组合数算出这个区间的方案。

设\(f_{i,j}\)表示到第\(i\)个数(并且这个数不是\(0\))在第\(j\)个区间时的方案,若从\(f_{k,l}(k<i,l<j)\)转移过来,也就是在\([k+1,i]\)的数要么在\(j\)这个区间内,要么是\(0\)。若区间\(j\)的长度为\(len\),\([k+1,i]\)中的数能选到区间\(j\)的数的个数为\(c\)(当然\(i\)一定要能选到),此时的方案数应该是\(\binom{len+c}{c}\)。

可以理解为我们要在\([0,len]\)这个范围内选出\(c\)个数使得非\(0\)数递增,那么我们让前面是\(1\sim len\),然后在最后面放\(c\)个\(0\),此时选到\(0\)的位置就表示这个位置是\(0\),否则就按选择的非零数填到后面没有选择的\(0\)的位置。

那么现在就有转移

\[f_{i,j}=\sum_{k=0}^{i-1}\binom{len+c}{c}\sum_{l=0}^{j-1}f_{k,l}
\]

后面那个前缀和优化一下时间复杂度就能到\(O(n^3)\)了,写起来细节有一点多。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1010,P=1e9+7;
ll n,a[N],b[N],p[N],inv[N],fac[N];
ll ans,f[N][N],g[N][N];
int main()
{
// printf("%d",sizeof(f)>>20);
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
p[i]=a[i];b[i]++;p[i+n]=b[i];
}
inv[1]=1;
for(ll i=2;i<=n;i++)
inv[i]=P-(P/i)*inv[P%i]%P;
inv[0]=1;
for(ll i=1;i<=n;i++)
inv[i]=inv[i-1]*inv[i]%P;
sort(p+1,p+1+2*n);
ll m=unique(p+1,p+1+2*n)-p-1;
for(ll i=0;i<m;i++)g[0][i]=1;
for(ll i=1;i<=n;i++){
for(ll j=1;j<m;j++){
if(p[j]>=a[i]&&p[j+1]<=b[i]){
ll l=p[j+1]-p[j];fac[0]=1;
for(ll k=1;k<=n;k++)
fac[k]=fac[k-1]*(l+k-1)%P;
for(ll k=i-1,c=1;k>=0;k--){
(f[i][j]+=fac[c]*inv[c]%P*g[k][j-1]%P)%=P;
if(p[j]>=a[k]&&p[j+1]<=b[k])c++;
}
}
g[i][j]=(g[i][j-1]+f[i][j])%P;
}
}
for(int i=1;i<=n;i++)
(ans+=g[i][m-1])%=P;
printf("%lld\n",ans);
return 0;
}

P3643-[APIO2016]划艇【dp】的更多相关文章

  1. P3643 [APIO2016]划艇

    P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...

  2. [洛谷P3643] [APIO2016]划艇

    洛谷题目链接:[APIO2016]划艇 题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 \(N\) 个划艇学校,编号依次为 \(1\) 到 \(N\).每个学校都拥有若干艘 ...

  3. 洛谷 P3643 - [APIO2016]划艇(dp)

    题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...

  4. [组合][DP]luogu P3643 [APIO2016]划艇

    题面 https://www.luogu.com.cn/problem/P3643 对于一个序列,第i项可取的值在{0}∪[ai,bi]之间,求使序列非零部分单调递增的方案数 分析 设 $f[i][j ...

  5. 题解 P3643 [APIO2016]划艇

    题解 一种思路很好想:\(f_{i,j}\) 表示前 \(i\) 所学校中,第 \(i\) 所学校参赛且派出 \(j\) 艘划艇的方案数.(转移就不列了.) 这种方式有一个致命点,就是 \(j\) 的 ...

  6. 洛谷P3643 [APIO2016]划艇(组合数学)

    题面 传送门 题解 首先区间个数很少,我们考虑把所有区间离散化(这里要把所有的右端点变为\(B_i+1\)代表的开区间) 设\(f_{i,j}\)表示考虑到第\(i\)个学校且第\(i\)个学校必选, ...

  7. BZOJ4584 & 洛谷3643 & UOJ204:[APIO2016]划艇——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4584 https://www.luogu.org/problemnew/show/P3643 ht ...

  8. BZOJ 4584 luogu P3643: [Apio2016]赛艇

    4584: [Apio2016]赛艇 Time Limit: 70 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 在首尔 ...

  9. 【BZOJ4584】[Apio2016]赛艇 DP

    [BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...

  10. [APIO2016]划艇

    题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...

随机推荐

  1. Flink API

    一.Flink API 1.DataSet:对静态数据进行批处理操作.将静态数据抽象成分布式数据集,使用Flink各种操作符处理数据,支持 Java .Scala.Python 2.DataStrea ...

  2. 检测一个页面所用的时间的js

    window.onload = function () { var loadTime = window.performance.timing.domContentLoadedEventEnd-wind ...

  3. ASP.NET真分页_接前篇引用AspNetPager.dll进行数据分页

    一.前端准备工作 1.之前我写到过<Asp.net中引用AspNetPager.dll进行数据分页>  这种分页方式只能在前台将数据分页,而每次点击查询时对目标数据库还是全查询,这样不仅会 ...

  4. springboot系列总结(二)---springboot的常用注解

    上一篇文章我们简单讲了一下@SpringBootApplication这个注解,申明让spring boot自动给程序进行必要的配置,他是一个组合注解,包含了@ComponentScan.@Confi ...

  5. Tomcat集群Cluster实现原理

    1.Tomcat集群         Tomcat集群的问题之一是如何处理Session,Session是有状态的,请求到了Tomcat,后续流传是要根据上下文(Context)来进行的.我们可以改造 ...

  6. centos7 ftp 拒绝连接

    2021-09-03 1. 问题描述 刚才在重新搭建 ftp 服务器时,发现 ftp 拒绝连接,想起来我还没启动 vsftpd 服务,尝试启动却无法启动 vsftpd 服务 2. 解决方法 使用命令 ...

  7. 一键备份公众号的所有文章到PDF,再也不用担心想看的文章被删了

    有的时候,我们会发现收藏的某个微信公众号文章会被删或者和谐了,尤其是对自己非常实用的文章,一定会后悔当初怎么没有复制或者备份下来. 单篇的公众号文章要备份,随便百度一下就能找到非常多方法,这里就不多废 ...

  8. Redis cluster的部署

    Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下 ...

  9. Zookeeper:进大厂不得不学的分布式协同利器!

    大家好,我是冰河~~ 最近,有很多小伙伴让我更新一些Zookeeper的文章,正好也趁着清明假期把之前自己工作过程当中总结的Zookeeper知识点梳理了一番,打算写一个[精通Zookeeper系列] ...

  10. WebService学习总结(四)--基于CXF的服务端开发

    本节将实践目前最流行的第二种web service 发布和调试框架  CXF Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩 ...