• 首先每个学校的边界范围是\(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)\)
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=500+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>T read()
{
T ans=0,f=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("3643.in","r",stdin);
freopen("3643.out","w",stdout);
#endif
}
int n,a[N],b[N],l[N<<1],tot;
void input()
{
n=read<int>();
For(i,1,n)
{
a[i]=read<int>(),b[i]=read<int>();
l[++tot]=a[i],l[++tot]=b[i]+1;
}
}
void init()
{
sort(l+1,l+tot+1);
tot=unique(l+1,l+tot+1)-l-1;
For(i,1,n)
{
a[i]=lower_bound(l+1,l+tot+1,a[i])-l;
b[i]=lower_bound(l+1,l+tot+1,b[i]+1)-l;
}
}
const int mo=1e9+7;
int inv[N],dp[N],C[N];
void work()
{
int len;
inv[1]=1;For(i,2,n)inv[i]=1ll*(mo-mo/i)*inv[mo%i]%mo;
C[0]=dp[0]=1;
For(i,1,tot-1)
{
len=l[i+1]-l[i];
For(i,1,n)C[i]=1ll*C[i-1]*(len+i-1)%mo*inv[i]%mo;
Fordown(j,n,1)if(a[j]<=i&&i+1<=b[j])
{
int f=0,pos=1,c=len;
Fordown(k,j-1,0)
{
(f+=1ll*dp[k]*c%mo)%=mo;
if(a[k]<=i&&i+1<=b[k])c=C[++pos];
}
(dp[j]+=f)%=mo;
}
}
int ans=0;
For(i,1,n)(ans+=dp[i])%=mo;
write(ans,'\n');
}
int main()
{
file();
input();
init();
work();
return 0;
}

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. 对int array进行排序

    今天再学习一些C#的基础知识,如对 Int Array进行排序: 你可以在控制台应用程序中,创建一个类别,它属性和2个构造函数: class Af { private int[] myVar; pub ...

  2. 案例学python——案例二:连接数据库MySql

    调侃的话:案例一跑完之后,欣赏把玩了一番.人就有点飘飘然,昨天除了做饭吃饭,就是玩三国杀,江郎才尽,今天周一,不飘了,敲点代码,看看Python操作数据库有啥不一样的. 前期准备: 1.数据库 电脑上 ...

  3. EXPERT FOR SQL SERVER诊断系列--索引

    概述   索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其 ...

  4. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--参数自动映射篇(6/8)

    文章目录 前情概要 路由.action的扫描.发现.注册搞定之后,后来我发现在我们的action里面获取参数往往都是通过request对象来一个一个获取.同样的一行代码我们不厌其烦的重复写了无数次.遂 ...

  5. Charles使用详解

    前言: Charles是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析. 一.主界面介绍       二.网页抓包 启动 Cha ...

  6. 网络编程学习笔记:Socket编程

    文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...

  7. 总结and规划

    不知不觉中又过去了一年,马上就要读研究生了,因此有必要对自己进行必要的总结,以及对自己有个良好的规划. 首先,描述自己当前的心情——对未来充满了恐惧和焦虑. 马上大学就要毕业了,回首经历的大学生涯,似 ...

  8. Popush End

    coconut: (咳咳)作为一名后台开发者,我觉得自己在这次作业完成中最大的收获就是跟node.js的异步模型打交道.首先我得出了一个这样的结论:异步模型能够提高服务器的高性能并发请求,但是却加大了 ...

  9. SQL大杂烩

    DML 语句(数据操作语言)Insert.Update. Delete.Merge DDL 语句(数据定义语言)Create.Alter. Drop.Truncate DCL 语句(数据控制语言)Gr ...

  10. layui使用记录

    一.layui表格渲染 如果后台返回的实力类里面包含另一个实体类,那么需要使用如下方式取出相应的值 var tableResult = table.render({ elem: '#' + Serve ...