题面

传送门

题解

首先区间个数很少,我们考虑把所有区间离散化(这里要把所有的右端点变为\(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. Texture Combiner

    [Texture Combiner] After the basic vertex lighting has been calculated, textures are applied. In Sha ...

  2. Spark 性能相关参数配置详解-Storage篇

    随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...

  3. java命令查询属性信息

    System.getProperty("user.home")可以查询JAVA系统的user.home属性的值, 除了user.home,还有user.dir, file.sepa ...

  4. JNDI数据源

    孤傲苍狼 只为成功找方法,不为失败找借口! JNDI学习总结(一)——JNDI数据源的配置 一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Cla ...

  5. TF录像存储专项测试

    测试环境 移动设备:小米4C 移动设备版本:Android 5.1 IPC版本号:0.1.4110_10.1.1.1.3948 安居小宝版本:Version:2.0.1 测试网络:IPC使用WIFI网 ...

  6. if-return 语句

    if(A > B): return A+1 return A-1 or if(A > B): return A+1 else: return A-1 +++++++++++++++++++ ...

  7. code1174 靶形数独

    主要是优化搜索顺序 从选择较少的点开始,可以大大提高效率 在search(x,y)找点的时候,对于一个空点(x y),设置一个评分score: score=min{ 横线x上能填的数字个数,竖线y上. ...

  8. code1068 乌龟棋

    暴力显然不行,所以考虑dp 记f[i][j][k][l]为使用i张1,j张2,k张3,l张4所得到的最大分数. 对于每个f[i][j][k][l],都可以由i-1张1,j张2,k张3,l张4所得到, ...

  9. debian 9 更换源 使用国内源 配置方法

    配置前请先参考: https://wiki.debian.org/SourcesList https://www.debian.org/mirror/list https://mirrors.tuna ...

  10. 44个javascript 变态题解析

    原题来自: javascript-puzzlers 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44… 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理 ...