首先将值域离散化成$O(n)$个连续段。

设$f[i][j][k]$表示第$i$个学校派出的数量在第$j$个连续段,在第$j$个连续段一共有$k$个学校的方案数。用组合数以及前缀和转移即可。

时间复杂度$O(n^3)$。

#include<cstdio>
#include<algorithm>
const int N=502,M=N*2,P=1000000007;
int n,m,i,j,k,t,len,inv[N],a[N],b[N],c[M],C[M][N],f[N][M],g[M],G[M],h[M][N],ans;
inline int getl(int x){for(int i=1;;i++)if(c[i-1]==x)return i;return -1;}
inline int getr(int x){for(int i=1;;i++)if(c[i]==x)return i;return -1;}
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]),c[++m]=--a[i],c[++m]=b[i];
std::sort(c+1,c+m+1);
for(j=0,i=1;i<=m;i++)if(c[i]!=c[i-1])c[++j]=c[i];
m=j;
for(i=1;i<=n;i++)a[i]=getl(a[i]),b[i]=getr(b[i]);
for(inv[0]=inv[1]=1,i=2;i<=n;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
for(i=1;i<=m;i++){
C[i][1]=len=c[i]-c[i-1];
for(j=2;j<=n&&j<=len;j++)C[i][j]=1LL*C[i][j-1]*(len-j+1)%P*inv[j]%P;
}
for(i=0;i<=m;i++)g[i]=1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)f[i][j]=f[i-1][j];
for(j=a[i];j<=b[i];j++)f[i][j]++;
}
for(i=1;i<=n;i++){
for(j=0;j<=m;j++)G[j]=0;
for(j=b[i];j>=a[i];j--){
for(k=f[i][j];k>=2;k--){
t=h[j][k-1];
up(G[j],1LL*t*C[j][k]%P);
up(h[j][k],t);
}
t=g[j-1];
up(G[j],1LL*t*C[j][1]%P);
up(h[j][1],t);
}
for(j=a[i];j<=m;j++){
up(G[j],G[j-1]);
up(g[j],G[j]);
}
}
for(i=1;i<=m;i++)for(j=1;j<=n;j++)up(ans,1LL*h[i][j]*C[i][j]%P);
return printf("%d",ans),0;
}

  

BZOJ4584 : [Apio2016]赛艇的更多相关文章

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

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

  2. 【BZOJ4584】[Apio2016]赛艇 DP

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

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

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

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

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

  5. APIO2016赛艇

    首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当 ...

  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. 消息队列MQ - Apache ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Jave程式,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. 1.que ...

  2. 51nod1057(python2计算n!)

    题目链接:www.51nod.com/onlineJudge/questionCode.html#!problemId=1057 思路:直接for循环呗- 代码: n = int( raw_input ...

  3. Struts2拦截器之ModelDrivenInterceptor

    叙述套路: 1.这是个啥东西,它是干嘛用的? 2.我知道它能干啥了,那它咋个用呢? 3.它能跑起来了,但是它是咋跑起来的是啥原理呢? 一.ModelDriven是个啥?他能做什么? 从前端页面到后端的 ...

  4. oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法

    最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...

  5. 在ubuntu上搭建开发环境1---在windows7的基础上在安装ubuntu(双系统)

    转载:http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html 当需要频繁使用ubuntu时,vmware虚拟机下运行ubuntu, ...

  6. Delphi线程基础知识

    参考http://blog.chinaunix.net/uid-10535208-id-2949323.html 一.概述 Delphi提供了好几种对象以方便进行多线程编程.多线程应用程序有以下几方面 ...

  7. C# Func<T,TResult>

    using System; namespace FuncDemo { internal class Program { private static void Main() { //类似委托功能 Fu ...

  8. WPF 多语言实现

    很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件.这篇博客中将介绍在WPF中实现多语言的方式. 方式一,使用WPF动态资源的方式实现.先简单介绍下StaticResour ...

  9. 使用windows的远程桌面连接连接Ubuntu

    想起来用笔记本连接一个windows server时只需要在远程桌面连接里面输入一下ip地址然后账号密码就可以了,十分简单.于是乎既然装了个Ubuntu当服务器使那么我就业来远程连接一下,由于wind ...

  10. [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决

    转自:http://blog.csdn.net/wanglei2258/article/details/24961233 [CentOS]安装软件:/lib/ld-linux.so.2: bad EL ...