题面

传送门

题解

首先区间个数很少,我们考虑把所有区间离散化(这里要把所有的右端点变为\(B_i+1\)代表的开区间)

设\(f_{i,j}\)表示考虑到第\(i\)个学校且第\(i\)个学校必选,这个学校选择的数在离散后的第\(j\)个区间内,方案数是多少

怎么转移呢,我们考虑枚举上一个不在第\(j\)个区间的学校\(k\),设\([k+1,i]\)中有\(a\)个学校是可以选在第\(j\)个区间的,且第\(j\)个区间的长度为\(b\),然后暴力枚举这\(m\)个数中有\(q\)个选了,那么转移就是

\[f_{i,j}=\sum_{k=0}^{i-1}\left(\sum_{p=0}^{j-1}f_{k,p}\right)\sum_{q=1}^{\min(a,b)}{a-1\choose q-1}{b\choose q}
\]

\(\sum_{p=0}^{j-1}f_{k,p}\)显然是可以做一个前缀和的

然后对于\(\sum_{q=1}^{\min(a,b)}{a-1\choose q-1}{b\choose q}\),它等于\(\sum_{q=1}^{\min(a,b)}{a-1\choose a-q}{b\choose q}\),可以理解为有\(a+b-1\)个数,要选出\(a\)个,然后枚举前\(a-1\)个数里选了多少个和后\(b\)个里选了多少个,那么上面的柿子就等价于\({a+b-1\choose a}\)

于是递推式就可以化为

\[f_{i,j}=\sum_{k=0}^{i-1}{a+b-1\choose a}\left(\sum_{p=0}^{j-1}f_{k,p}\right)
\]

然后没有然后了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1005,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int A[N],B[N],D[N],inv[N],len[N],C[N],f[N][N],g[N][N];
int n,m,res;
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)A[i]=read(),B[i]=read(),D[++m]=A[i],D[++m]=B[i]+1;
D[++m]=0,sort(D+1,D+1+m),D[m+1]=D[m]+1,m=unique(D+1,D+m+2)-D-1;
fp(i,1,m-1)len[i]=D[i+1]-D[i];
fp(i,1,n){
A[i]=lower_bound(D+1,D+1+m,A[i])-D,
B[i]=upper_bound(D+1,D+1+m,B[i])-D-1;
}
--m;
inv[0]=inv[1]=1;fp(i,2,n)inv[i]=mul(P-P/i,inv[P%i]);
f[0][0]=1;
fp(i,0,m)g[0][i]=1;
fp(i,1,n){
for(R int j=A[i],a,b;j<=B[i];++j){
a=len[j]-1,b=0,C[i]=1;
fd(k,i-1,0)
A[k+1]<=j&&B[k+1]>=j?(C[k]=1ll*(++a)*inv[++b]%P*C[k+1]%P):C[k]=C[k+1];
fd(k,i-1,0)f[i][j]=add(f[i][j],mul(C[k],g[k][j-1]));
}
g[i][0]=f[i][0];
fp(j,1,m)g[i][j]=add(f[i][j],g[i][j-1]);
res=add(res,g[i][m]);
}
printf("%d\n",res);
return 0;
}

洛谷P3643 [APIO2016]划艇(组合数学)的更多相关文章

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

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

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

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

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

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

  4. P3643 [APIO2016]划艇

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

  5. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

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

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

  7. 题解 P3643 [APIO2016]划艇

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

  8. 洛谷P4562 [JXOI2018]游戏(组合数学)

    题意 题目链接 Sol 这个题就比较休闲了. \(t(p)\)显然等于最后一个没有约数的数的位置,那么我们可以去枚举一下. 设没有约数的数的个数有\(cnt\)个 因此总的方案为\(\sum_{i=c ...

  9. 洛谷P3642 [APIO2016]烟火表演

    传送门 题解 fy大佬好强……我根本看不懂…… //minamoto #include<bits/stdc++.h> #define ll long long using namespac ...

随机推荐

  1. 手动为 Team Foundation Server 安装 SQL Server

    本主题中的步骤适用于安装 SQL Server 2012 企业版,你也可以使用安装标准版的相同步骤. 适用于 SQL 2014 的步骤与以上步骤也非常相似. 我们将在 TFS 所在的同一服务器上安装 ...

  2. python gun readline

    https://github.com/ludwigschwardt/python-gnureadline

  3. ZPP002M可重复执行

    AutoOutToSAP一直未回写完成,查看得知最后一步执行时间超长, stop job ZPP002M可重复执行

  4. 高性能Web服务器Nginx的配置与部署研究(6)核心模块之主模块的测试常用指令

    1. daemon 含义:设置是否以守护进程模式运行 语法:daemon on|off 缺省:on 示例:daemon off; 注意:生产环境(production mode)中不要使用daemon ...

  5. 文件操作类File

    File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 FileInfo类:提供创建.复制.删除.移动和打开文件的属性和实例方法.FileInfo类 Directory类:公开用于 ...

  6. 对加密的了解(DES/3DES/AES区别 )

    DES 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式. 目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS.ATM.磁卡及智能卡(IC卡).加油站.高速公路 ...

  7. SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数

    用户表:select count(*) 总表数 from sysobjects where xtype='u' 刚才那个是用户表,下面这个是系统表加用户表: select count(*) 总表数 f ...

  8. 返回JSON到前台的对象属性设置

    1.项目中使用JSON的第三方架包:jackson-annotations-2.8.0.jar 2.可以将对象的属性返回进行相应的处理 比如格式化时间.密码敏感等属性 如:User.java pack ...

  9. [C++] Vtable(虚函数表)

    Vtable(虚函数表)

  10. 提高你的Python能力:理解单元测试

    对于程序开发新手来说,一个最常见的困惑是测试的主题.他们隐约觉得“单元测试”是很好的,而且他们也应该做单元测试.但他们却不懂这个词的真正含义.如果这听起来像是在说你,不要怕!在这篇文章中,我将介绍什么 ...