• 首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当前这个学校派出数量在那个区间里
  • 转移的时候,如果前面所有的学校都不在此区间内,那贡献为\(\sum_{i'=1}^{i}\sum_{j'=1}^{j}dp[i'][j']\)
  • 但是如果有学校要选在该区间内,问题便转化为在一段长度为len的区间内选出k个数,使他们递增,当然,有些数是可以不选的,该方案数为\(\sum_{i=0}^{k}C(k,k-i)*C(len,i)\),这个东西看起来一点都不好算,我们把这个式子化为\(C(len+k,k)\)
  • 所以如果现在是第i个学校到第k个学校在此范围内,并且i,k学校强制选择,则方案数为\(C(i-k-1+len,i-k-1)\),贡献为\(\sum_{i'=i-1}^{1}C(len+i-i'-1,i-i'-1)\sum_{k=1}^{i'-1}\sum_{j'=1}^{j-1}dp[k][j']\)其中&j&是当前枚举的区间
  • 对于每一段区间,\(len\)相同,所以我们在枚举区间是处理一下组合数,后面的两重循环用前缀和处理一下,时间复杂度\(O(n^3)\)
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int sign;
  4. typedef long long ll;
  5. #define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
  6. #define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
  7. const int N=500+5;
  8. bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
  9. bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
  10. template<typename T>T read()
  11. {
  12. T ans=0,f=1;
  13. char ch=getchar();
  14. while(!isdigit(ch)&&ch!='-')ch=getchar();
  15. if(ch=='-')f=-1,ch=getchar();
  16. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
  17. return ans*f;
  18. }
  19. template<typename T>void write(T x,char y)
  20. {
  21. if(x==0)
  22. {
  23. putchar('0');putchar(y);
  24. return;
  25. }
  26. if(x<0)
  27. {
  28. putchar('-');
  29. x=-x;
  30. }
  31. static char wr[20];
  32. int top=0;
  33. for(;x;x/=10)wr[++top]=x%10+'0';
  34. while(top)putchar(wr[top--]);
  35. putchar(y);
  36. }
  37. void file()
  38. {
  39. #ifndef ONLINE_JUDGE
  40. freopen("3643.in","r",stdin);
  41. freopen("3643.out","w",stdout);
  42. #endif
  43. }
  44. int n,a[N],b[N],l[N<<1],tot;
  45. void input()
  46. {
  47. n=read<int>();
  48. For(i,1,n)
  49. {
  50. a[i]=read<int>(),b[i]=read<int>();
  51. l[++tot]=a[i],l[++tot]=b[i]+1;
  52. }
  53. }
  54. void init()
  55. {
  56. sort(l+1,l+tot+1);
  57. tot=unique(l+1,l+tot+1)-l-1;
  58. For(i,1,n)
  59. {
  60. a[i]=lower_bound(l+1,l+tot+1,a[i])-l;
  61. b[i]=lower_bound(l+1,l+tot+1,b[i]+1)-l;
  62. }
  63. }
  64. const int mo=1e9+7;
  65. int inv[N],dp[N],C[N];
  66. void work()
  67. {
  68. int len;
  69. inv[1]=1;For(i,2,n)inv[i]=1ll*(mo-mo/i)*inv[mo%i]%mo;
  70. C[0]=dp[0]=1;
  71. For(i,1,tot-1)
  72. {
  73. len=l[i+1]-l[i];
  74. For(i,1,n)C[i]=1ll*C[i-1]*(len+i-1)%mo*inv[i]%mo;
  75. Fordown(j,n,1)if(a[j]<=i&&i+1<=b[j])
  76. {
  77. int f=0,pos=1,c=len;
  78. Fordown(k,j-1,0)
  79. {
  80. (f+=1ll*dp[k]*c%mo)%=mo;
  81. if(a[k]<=i&&i+1<=b[k])c=C[++pos];
  82. }
  83. (dp[j]+=f)%=mo;
  84. }
  85. }
  86. int ans=0;
  87. For(i,1,n)(ans+=dp[i])%=mo;
  88. write(ans,'\n');
  89. }
  90. int main()
  91. {
  92. file();
  93. input();
  94. init();
  95. work();
  96. return 0;
  97. }

APIO2016赛艇的更多相关文章

  1. BZOJ 4584 luogu P3643: [Apio2016]赛艇

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

  2. 【BZOJ4584】[Apio2016]赛艇 DP

    [BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...

  3. bzoj 4584: [Apio2016]赛艇【dp】

    参考:https://www.cnblogs.com/lcf-2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数 ...

  4. BZOJ4584 : [Apio2016]赛艇

    首先将值域离散化成$O(n)$个连续段. 设$f[i][j][k]$表示第$i$个学校派出的数量在第$j$个连续段,在第$j$个连续段一共有$k$个学校的方案数.用组合数以及前缀和转移即可. 时间复杂 ...

  5. BZOJ4584 APIO2016赛艇(动态规划+组合数学)

    如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...

  6. BZOJ 4584 [Apio2016]赛艇 ——动态规划

    Subtask 1 直接$N^2$ $DP$,就可以了 Subtask 2 用$f[i][j]$表示当前位置为$i$,结束元素为$j$的方案数. Subtask 3 看下面 Subtask 4 首先可 ...

  7. 校际联合Contest

    每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

随机推荐

  1. 初识Identity(一)

    一.Authentication(身份验证)和Authorization(授权) 如何构建安全的web应用?authentication和authorization是asp.net中最重要最基本的防护 ...

  2. Yarn 入门

    Yarn 是快速.可靠.安全的 js 包管理器. 关键词: nodejs, 包管理, yarn 简介 Yarn 是快速.可靠.安全的 js 包管理器. 快速 - Yarn 会缓存它下载的每个包,所以无 ...

  3. Luogu3877 TJOI2010 打扫房间 二分图、网络流

    传送门 真是菜死了模板题都不会-- 首先\(30 \times 30\)并不能插头DP,但是范围仍然很小所以考虑网络流. 注意每个点都要包含在一个回路中,那么每一个点的度数都必须为\(2\),也就是说 ...

  4. LiveCharts文档-3开始-3类型和设置

    原文:LiveCharts文档-3开始-3类型和设置 LiveCharts文档-3开始-3类型和设置 类型和设置 这一部分非常的重要,涉及到LiveCharts的基本构成单元的介绍 LiveChart ...

  5. odoo订餐系统之菜单设计

    1.model类的设计 class MyLunchProduction(osv.Model): _name = "mylunch.production" _description ...

  6. 总目录(Catalog)

    总目录(Catalog) C#高级编程(C# advanced programming) 1.并发编程(Concurrent programming)(8) ...... 数据结构与算法(Data s ...

  7. FreeCAD源码初步了解

    FreeCAD简介 FreeCAD是基于OpenCASCADE的开源CAD/CAE软件,完全开源(GPL的LGPL许可证),官方源码地址,详情可参考维基百科,百度百科等等. 如果要编译FreeCAD, ...

  8. 以太坊remix-ide本地环境搭建

    remix-ide简介 ​ remix-ide是一款以太坊官方solisity语言的在线IDE,可用于智能合约的编写.测试与部署,不过某些时候可能是在离线环境下工作或者受限于网速原因,使用在线remi ...

  9. linux系统最小化安装后的初始化脚本

    作为运维人员,经常会初始化系统,系统在安装过程中基本都会选择最小化安装,这样安装好的系统里会缺少很多环境. 下面分享一个系统安装后的初始化脚本: #!/bin/bash #系统时最小化安装的,这里要安 ...

  10. WinForm多线程+委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...