题面

https://www.luogu.com.cn/problem/P3643

对于一个序列,第i项可取的值在{0}∪[ai,bi]之间,求使序列非零部分单调递增的方案数

分析

设 $f[i][j]$ 表示第 i 位选择的值为 j 的方案数,则有

$f[i][j]=\sum_{k=0}^{i-1}\sum_{l=1}^{j-1} f[k][l] (j\in[a_i,b_i])$

$f[i][j]=0 (j\notin[a_i,b_i])$

很容易发现这个方程问题在于 j 的状态数过多,存不下也不能跑

那么考虑离散化取值,就会离散化成 2n 个区间

状态 $f[i][j]$ 变为第 i 位选择的值在第 j 个区间里的方案数

此时转移时 1~i-1 中的学校分为了两类,一类是选择的值没在第 j 个区间里的,一类是在里面的

取值没在第 j 个区间里的不需要额外考虑,在第 j 个区间里的则显然存在可组合情况(因为强制有序所以不是排列情况)

设当前枚举到第 k 个学校, k+1~i 里有 p 个学校可在第 j 个区间选择里,那么组合方案数则为 $\binom{len_j+p}{p}$

考虑简单证明,往 $len_j$ 个值中增加 p 个 0 ,组合出来的结果除去 0 后强制有序显然单调递增,即 $\binom{len_j}{p}$ 为从 $len_j$ 选择 p 个值并单调递增的方案数

加入的 p 个 0 对应着每个位置不选择值,所以是正确的

考虑转移方程中的该式子,因为第i个学校必须选,所以只加入 p-1 个 0 ,即 $\binom{len_j+p-1}{p}$

$f[i][j]=\sum_{k=0}^{i-1}\sum_{l=1}^{j-1} \binom{len_j+p-1}{p}\times f[k][l] (j\in[a_i,b_i])$

$f[i][j]=0 (j\notin[a_i,b_i])$

$\sum_{l=1}^{j-1} f[k][l]$ 可以前缀和,注意预处理组合数减小常数即可

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const ll P=1e9+7;
  7. const int N=510;
  8. int n,m;
  9. int a[N],b[N],c[2*N];
  10. ll f[N],inv[N],C[N],ans;
  11.  
  12. ll Pow(ll x,ll y) {ll ans=1;for (;y;y>>=1,x=x*x%P) if (y&1) ans=ans*x%P;return ans;}
  13.  
  14. int main() {
  15. scanf("%d",&n);
  16. for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]),c[i*2-1]=a[i],c[i*2]=++b[i],inv[i]=Pow(i,P-2);
  17. sort(c+1,c+2*n+1);m=unique(c+1,c+2*n+1)-c-1;
  18. for (int i=1;i<=n;i++) a[i]=lower_bound(c+1,c+m+1,a[i])-c,b[i]=lower_bound(c+1,c+m+1,b[i])-c;
  19. C[0]=f[0]=1;
  20. for (int k=2,l;k<=m;k++) {
  21. l=c[k]-c[k-1];for (int i=1;i<=n;i++) C[i]=C[i-1]*(l-1+i)%P*inv[i]%P;
  22. for (int i=n;i;i--)
  23. if (a[i]<k&&k<=b[i]) {
  24. ll h=0;
  25. for (int j=i-1,cnt=1;j>=0;j--) {
  26. (h+=C[cnt]*f[j]%P)%=P;
  27. if (a[j]<k&&k<=b[j]) cnt++;
  28. }
  29. (f[i]+=h)%=P;
  30. }
  31. }
  32. for (int i=1;i<=n;i++) (ans+=f[i])%=P;
  33. printf("%lld\n",ans);
  34. }

[组合][DP]luogu P3643 [APIO2016]划艇的更多相关文章

  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. BZOJ 4584 luogu P3643: [Apio2016]赛艇

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

  5. 题解 P3643 [APIO2016]划艇

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

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

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

  7. CF 553A 组合DP

    http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...

  8. 2019年9月训练(贰)区间DP (luogu 4290)

    区间DP luogu 4290 明显的区间DP. 定义 dp[l][r][k]/*表示区间[l,r]能否凑成k(W,I,N,G)字符*/mp['W']=1;mp['I']=2;mp['N']=3;mp ...

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

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

随机推荐

  1. 推荐一个vuepress模板,一键快速搭建文档站

    介绍 vuepress-template是一个简单的VuePress案例模板,目的是让用户可以直接clone这个仓库,作为初始化一个VuePress网站启动项目,然后在这个项目的基础上新增自定义配置和 ...

  2. Electron Security All In One

    Electron Security All In One https://www.electronjs.org/docs/tutorial/security CSP Content-Security- ...

  3. Chrome 黑科技

    Chrome 黑科技 秒变记事本 data:text/html, <htmlcontenteditable> OK <a href="data:text/html, &qu ...

  4. live chat for website UX

    live chat for website UX increase customer satisfaction using a live chat https://crisp.chat/en/live ...

  5. Web 安全 & 反爬虫原理

    Web 安全 & 反爬虫原理 数据加密/解密 HTTPS ip 封锁 请求限制 爬虫识别,canvas 指纹 refs https://segmentfault.com/a/119000001 ...

  6. qt 注册热键

    原文 将所需的库添加到您的qmake项目(.PRO文件) LIBS += \ -lUser32 2.在代码中包含所需的头文件. #include <windows.h> 在程序开始时注册热 ...

  7. DeFi下半场,除了YFI,还有BGV!

    自今年夏季开始,DeFi市场便已经进入火热态势,且持续至今.其中,去中心化交易所(DEX)以及各种金融衍生品的出现,吸引了大批资金的进入,资本市场的目光已从传统金融移到了DeFi市场,期望着能够从De ...

  8. Python爬虫_糗事百科

    本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...

  9. Error: Actions must be plain objects. Use custom middleware for async actions.

    原本代码: import { SREACH_FOCUS, SREACH_BLUR } from "./actionType" export const searchFocus = ...

  10. 移动端时间回显iphone出现的问题

    new Date(item.startTime.replace(/-/g, '/') dateFormat('hh:mm', new Date(item.startTime.replace(/-/g, ...