BZOJ4584 : [Apio2016]赛艇
首先将值域离散化成$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]赛艇的更多相关文章
- BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...
- 【BZOJ4584】[Apio2016]赛艇 DP
[BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...
- BZOJ 4584 luogu P3643: [Apio2016]赛艇
4584: [Apio2016]赛艇 Time Limit: 70 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在首尔 ...
- bzoj 4584: [Apio2016]赛艇【dp】
参考:https://www.cnblogs.com/lcf-2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数 ...
- APIO2016赛艇
首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当 ...
- BZOJ 4584 [Apio2016]赛艇 ——动态规划
Subtask 1 直接$N^2$ $DP$,就可以了 Subtask 2 用$f[i][j]$表示当前位置为$i$,结束元素为$j$的方案数. Subtask 3 看下面 Subtask 4 首先可 ...
- 校际联合Contest
每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2017FJ省队集训 游记
2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...
随机推荐
- Swift - 简单封装一个工具类模板
创建模板类(封装一个类) 例1:新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var desc ...
- wifi diplasy流程介绍
转自:http://blog.csdn.net/dnfchan/article/details/8558552/ 另外一篇不错的参考文章:http://www.360doc.com/content/ ...
- Delphi线程同步(临界区、互斥、信号量)
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...
- Pyqt 打开外部链接的几种方法
Pyqt 触发一个事件,打开外部链接,我找到了这个方法,供大家参考 1. QDesktopServices 的openUrl 方法 QtGui.QDesktopServices.openUrl(QtC ...
- 【翻译十一】java-原子性操作
Atomic Access In programming, an atomic action is one that effectively happens all at once. An atomi ...
- 动态生成SQL执行语句
SET @qry = 'SELECT product_cd, name, product_type_cd, date_offered, date_retired FROM product WHERE ...
- ARM寻址方式,王明学learn
ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...
- Boost练习程序(multi_index_container)
代码来自:http://blog.csdn.net/whuqin/article/details/8482547 该容器能实现多列索引,挺好. #include <string> #inc ...
- 一个简单的Object Hook的例子(win7 32bit)
Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改. _OBJECT_HEADER: kd> dt _OBJECT_HEA ...
- animation动画兼容所有手机
.canvasAnim{ position: absolute; width:240px; height:240px; top:; z-index:; top:-20px; left:-5px; bo ...