正题

题目链接: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. Specification使用in

    //是否包含下级授权点 1 包含 2 不包含 List<AuthorizationPoint> authList = null; List<Long> pointIdList ...

  2. Win10下安装SVN出现2503/2502解决方法

    出现错误的原因是权限不够 在win10的开始按钮上,右键点击,选择"命令提示符(管理员)(A)",弹出管理员身份运行模式的命令行的窗口,输入如下的命令: msiexec /pack ...

  3. taro小程序地址选择组件

    效果图: address_picker.tsx: import Taro, { Component } from '@tarojs/taro' import { View, PickerView, P ...

  4. 9、二进制安装K8s之增加node

    二进制安装K8s之增加node 1.复制文件,要部署几台就直接复制即可 #二进制文件 scp /data/k8s/bin/{kubelet,kube-proxy} root@192.168.100.1 ...

  5. windows上解决git每次重复输入账号密码

    win7电脑: 1.在 C:\Users\Administrator 下 编辑 .gitconfig文件 2.在原有内容下添加一行(此行作用为自动保存,保存修改后再使用一次GIT,输入账号密码后下次即 ...

  6. Java反射的浅显理解

    一.回顾反射相关的知识 1.在xml文件中使用反射的好处: 1)代码更加灵活,后期维护只需要修改配置文件即可 · 初学者一般习惯于在代码本身上直接修改,后期也可以修改配置文件达到相同的目的 · 修改配 ...

  7. redux的使用

    1.redux的使用 核心概念 action 动作的对象 包含2个属性 type:标识属性, 值为字符串, 唯一, 必要属性 data:数据属性, 值类型任意, 可选属性 例子:{ type: 'AD ...

  8. Tomcat 端口配置及原理详解

    1. tomcat 文件配置详细说明 tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口配置路径为tomcat\ c ...

  9. (六)羽夏看C语言——函数

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  10. 解决FTPClient下载网络文件线程挂起问题

    今天在windows上调试FTP下载文件时,出险线程假死,代码如下: if (inputStream != null) { byte[] data = null; ByteArrayOutputStr ...