题目

\(N\)个位置,每个位置要么不选,要么选\([ a_i, b_i ]\)中的一个数;

问最后的单调上升序列(mod 1e9+7)有多少种;

\(1 \le N \le 500\)

题解

  • orz abclzr

  • 直接\(dp\)最后一位是什么数字的话只能得到31分

  • 将数字离散化分段,第\(i\)段为\([l_i,r_i)\),设\(f_{i,j}\)表示第i个位置选的数字在第j段的方案数(第0段表示没有)

    \[f_{i,j} \ = \sum_{k=0}^{i-1} \sum_{l=0}^{j-1} f_{k,l} \times cal(k+1,i,j) \\
    ans = \sum_{i=1}^n \sum_{j=1}^m f_{i,j} \\
    \]

  • 其中 $ cal(l,r,x) $ 表示 $ [l,r) $ 都不选或者选在第j段并且单调上升的方案数

  • 设 $ [ l,r) $ 这里面有 $ S $ 个包含x区间,x区间的长度为 $ L $ 

    \[cal(l,r,x) = \sum_{i=0}^{S}(^S_i)(^L_{i+1}) = \sum_{i=0}^{S}(^S_{S-i})(^L_{i+1}) \\
    思考组合意义:左边选S-i个再在右边选i+1个相当与一起选S+1个\\
    cal(l,r,x) = (^{S+L}_{S+1}) \\
    \]

  • 前缀和优化dp即可:\(O(n^3)\)  

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1010,mod=1e9+7;
    int n,tot,sub[N],L[N],R[N],ny[N],l[N],f[N][N];
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    int main(){
    // freopen("boat.in","r",stdin);
    // freopen("boat.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
    scanf("%d%d",&L[i],&R[i]);
    sub[++tot]=L[i];
    sub[++tot]=++R[i];
    }
    sort(sub+1,sub+tot+1);
    tot=unique(sub+1,sub+tot+1)-sub-1;
    for(int i=1;i<=n;++i){
    L[i]=lower_bound(sub+1,sub+tot+1,L[i])-sub;
    R[i]=lower_bound(sub+1,sub+tot+1,R[i])-sub;
    }
    ny[1]=1;for(int i=2;i<=n;++i)ny[i]=(ll)(mod-mod/i)*ny[mod%i]%mod;
    for(int i=0;i<tot;++i)f[0][i]=1;
    for(int i=1;i<tot;++i)l[i]=sub[i+1]-sub[i];
    for(int i=1;i<=n;++i){
    for(int j=L[i];j<R[i];++j){
    int C=l[j],a=l[j],b=1;
    for(int k=i-1;~k;--k){
    inc(f[i][j],(ll)f[k][j-1]*C%mod);
    if(L[k]<=j&&j<R[k])C=(ll)C*(++a)%mod*ny[++b]%mod;
    }
    }
    for(int j=1;j<tot;++j)inc(f[i][j],f[i][j-1]);
    }
    int ans=0;for(int i=1;i<=n;++i)inc(ans,f[i][tot-1]);
    cout<<ans<<endl;
    return 0;
    }
    //菜兔兔写的部分分
    #include<bits/stdc++.h>
    #define pb push_back
    using namespace std;
    const int N=510,M=2000010,mod=1e9+7;
    int n,a[N],b[N],len[N],sub[M],tot;
    int f[M],g[M];
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    int main(){
    // freopen("boat.in","r",stdin);
    // freopen("boat.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
    scanf("%d%d",&a[i],&b[i]);
    for(int j=a[i];j<=b[i];++j)sub[++tot]=j;
    }
    sort(sub+1,sub+tot+1);
    tot=unique(sub+1,sub+tot+1)-sub-1;
    f[0]=1;for(int i=0;i<=tot;++i)g[i]=1;
    for(int i=1;i<=n;++i){
    a[i]=lower_bound(sub+1,sub+tot+1,a[i])-sub;
    b[i]=lower_bound(sub+1,sub+tot+1,b[i])-sub;
    for(int j=a[i];j<=b[i];++j)f[j]=g[j];
    for(int j=a[i];j<=tot;++j)inc(g[j]=f[j],g[j-1]);
    }
    cout<<g[tot]-1<<endl;
    return 0;
    }

【loj2567】【APIO2016】划艇的更多相关文章

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

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

  2. P3643 [APIO2016]划艇

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

  3. [APIO2016]划艇

    题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...

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

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

  5. 题解 P3643 [APIO2016]划艇

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

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

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

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

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

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

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

  9. Codeforces Educational Round 81 解题报告

    前置扯淡 赛前:这场\(Div2\)呀,那我写\(3\)题就行,\(D\)题尽力就好 赛中:啊啊,\(ABC\)我全过了\(pretest\),我太强了!!这把上蓝稳了 赛后:\(woc\),为啥被\ ...

  10. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

随机推荐

  1. MySQL单表数据量过千万,采坑优化记录,完美解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  2. 无法生成服务引用(添加WebService)

    参考地址:http://www.52study.org/bencandy-120-1076-1.html 问题场景:.在工程中添加WebService,报错: 解决办法:  1.配置该服务引用 将下面 ...

  3. JDBC简单增删改查实现(单表)

    0.准备工作 开发工具: MySQL数据库, intelliJ IDEA2017. 准备jar包: mysql-connector-java-5.1.28-bin.jar(其他均可) 1. 数据库数据 ...

  4. 自学Python编程的第八天----------来自苦逼的转行人

    2019-09-18-21:11:24(初学者不会学博客,望大家见谅见谅) 今天学的内容是有关list..dict.set集合的使用方法和注意事项 list和dict在循环中不可删,而且list在迭代 ...

  5. vue-cli + webpack 环境搭建

    1.下载nodeJS,官网 https://nodejs.org/en/ . 2.安装nodeJS.安装完成后可以检测node -v 如果版本号的话则正常. 3.安装淘宝镜像.npm install ...

  6. Oracle大表改为分区表及表空间切换方案

    Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分 ...

  7. FIneUICore 版本的 AppBoxMvcCore

    http://www.51aspx.com/code/codename/64088 CORE版本的APPBOXMVC欢迎下载

  8. Jmeter计数器的使用-转载

    说一下jmeter中,配置元件-计数器的使用. 如果需要引用的数据量较大,且要求不能重复或者需要自增,那么可以使用计数器来实现. 1.启动jmeter,添加线程组,右键添加配置元件——计数器,如下图: ...

  9. MSSQL镜像场景

    1.版本:一般MSSQL2016以下版本使用. 2.适用小数据库容量的异地备份:如果是数据库容量较大,产生的日志比较多:经测试,9G的数据库大小,镜像数月个日志大小达到400G,硬盘开销太大.

  10. MySQL DataType--浮点数(Floating-Point Types)学习

    浮点数(Floating-Point Types) MySQL支持两种浮点数类型来表示近似值:1.FLOAT,单精度浮点数,使用4字节存储,存储数据范围3.402823466E+38 - -1.175 ...