正题

题目链接: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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const ll N=1010,P=1e9+7;
  7. ll n,a[N],b[N],p[N],inv[N],fac[N];
  8. ll ans,f[N][N],g[N][N];
  9. int main()
  10. {
  11. // printf("%d",sizeof(f)>>20);
  12. scanf("%lld",&n);
  13. for(ll i=1;i<=n;i++){
  14. scanf("%lld%lld",&a[i],&b[i]);
  15. p[i]=a[i];b[i]++;p[i+n]=b[i];
  16. }
  17. inv[1]=1;
  18. for(ll i=2;i<=n;i++)
  19. inv[i]=P-(P/i)*inv[P%i]%P;
  20. inv[0]=1;
  21. for(ll i=1;i<=n;i++)
  22. inv[i]=inv[i-1]*inv[i]%P;
  23. sort(p+1,p+1+2*n);
  24. ll m=unique(p+1,p+1+2*n)-p-1;
  25. for(ll i=0;i<m;i++)g[0][i]=1;
  26. for(ll i=1;i<=n;i++){
  27. for(ll j=1;j<m;j++){
  28. if(p[j]>=a[i]&&p[j+1]<=b[i]){
  29. ll l=p[j+1]-p[j];fac[0]=1;
  30. for(ll k=1;k<=n;k++)
  31. fac[k]=fac[k-1]*(l+k-1)%P;
  32. for(ll k=i-1,c=1;k>=0;k--){
  33. (f[i][j]+=fac[c]*inv[c]%P*g[k][j-1]%P)%=P;
  34. if(p[j]>=a[k]&&p[j+1]<=b[k])c++;
  35. }
  36. }
  37. g[i][j]=(g[i][j-1]+f[i][j])%P;
  38. }
  39. }
  40. for(int i=1;i<=n;i++)
  41. (ans+=g[i][m-1])%=P;
  42. printf("%lld\n",ans);
  43. return 0;
  44. }

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. [ES6深度解析]12:Classes

    我们将讨论一个老问题:在JavaScript中创建对象的构造函数. 存在的问题 假设我们想要创建最典型的面向对象设计的示例:Circle类.假设我们正在为一个简单的Canvas库编写一个Circle. ...

  2. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

    MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...

  3. plsql developer中各个window的作用【转】

    转载自,原文链接: -程序窗口(program window) :可以执行 sql,sqlplus 相关的语句,例如存储过程,方法,一般用来开发程序用的. -测试窗口(test window):一般是 ...

  4. Git(GitHub)配合TortoiseGit使用

    1.首先下载安装配置Git 安装请参照 https://www.cnblogs.com/xueweisuoyong/p/11914045.html 配置请参照 https://www.jianshu. ...

  5. Go错误处理正确姿势

    1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下 ...

  6. go协程调度

    目录 前言 1. 线程池的缺陷 2.Goroutine 调度器 3.调度策略 3.1 队列轮转 3.2 系统调用 3.3 工作量窃取 4.GOMAXPROCS设置对性能的影响 参考 前言 Gorout ...

  7. swiper tabs综合示例

    html部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...

  8. 20210804 noip30

    考场 第一眼感觉 T1 是状压 DP,弃了.T2 好像也是 DP???看上去 T3 比较可做. 倒序开题.T3 暴力是 \(O(pn\log p)\)(枚举 \(x\),二分答案,看能否分成合法的不超 ...

  9. wireshark 解密加密报文

    wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...

  10. DHCP 协议及其交互过程

    1. DHCP用途简介: DHCP服务应用于大型局域网络中,使网络中的主机自动获取IP地址,网关,DNS服务器等信息,能够提升IP地址的利用率.一般情况下,我们的家用.公司.公共场合使用的路由器都具有 ...