题目链接:赛艇

  讲道理好好的Boat为啥要翻译成赛艇呢……题面中不也是划艇么……

  这道题考虑一下dp。由于划艇数量过于庞大,所以肯定不能直接记录到dp状态中。所以一个想法就是把数量离散化,然后把每个学校的数量在哪一段内记录下来。也就是说\(f_{i,j,k}\)表示前\(i\)个学校,第\(i\)所学校派出的划艇数量在区间\(j\)内,并且区间\(j\)内共有\(k\)个学校的方案数。然后分类讨论一下转移:

  当\(k\ne 1\)时,有:

\begin{aligned}
f_{i,j,k} &=\frac{C(len_j,k)}{C(len_j,k-1)}\sum_{i'=0}^{i-1}f_{i',j,k-1}  \\
&=\frac{len_j-k+1}{k}\sum_{i'=0}^{i-1}f_{i',j,k-1}
\end{aligned}

  当\(k=1\)时,有:

\begin{aligned}
f_{i,j,k}=\sum_{i'=0}^{i-1}\sum_{j'=0}^{j-1}\sum_{k'=0}^{i'}f_{i',j',k'}
\end{aligned}

  于是前缀和优化即可。可以发现记录两个前缀和之后\(f\)数组没必要记录了。时间复杂度\(O(n^3)\),空间复杂度\(O(n^2)\)。

  下面贴代码(常数略大):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define N 510
#define mod 1000000007 using namespace std;
typedef long long llg; int le[N],ri[N],n,ni[N],d[N<<1],ld;
llg s1[N][N<<1],s2[N<<1][N]; void gi(int &x){x=lower_bound(d+1,d+ld+1,x)-d;}
int mi(llg a,int b){
llg s=1;
while(b){
if(b&1) s=s*a%mod;
a=a*a%mod; b>>=1;
}
return s;
} int main(){
File("a");
scanf("%d",&n); ni[0]=1;
for(int i=1;i<=n;i++){
scanf("%d %d",&le[i],&ri[i]);
d[++ld]=le[i],d[++ld]=++ri[i];
ni[i]=mi(i,mod-2);
}
sort(d+1,d+ld+1); ld=unique(d+1,d+ld+1)-d-1;
for(int i=1;i<=n;i++) gi(le[i]),gi(ri[i]);
for(int i=0;i<=ld;i++) s1[0][i]=1;
for(int i=1,x,y;i<=n;i++){
for(int j=ri[i]-1;x=d[j+1]-d[j],j>=le[i];j--){
for(int k=min(x,i);k>1;k--){
y=s2[j][k-1]*ni[k]%mod*(x-k+1)%mod;
(s1[i][j]+=y)%=mod,(s2[j][k]+=y)%=mod;
}
y=s1[i-1][j-1]*x%mod;
(s1[i][j]+=y)%=mod,(s2[j][1]+=y)%=mod;
}
s1[i][0]=1;
for(int j=1;j<=ld;j++){
s1[i][j]+=s1[i-1][j]+s1[i][j-1];
(s1[i][j]-=s1[i-1][j-1])%=mod;
if(s1[i][j]<0) s1[i][j]+=mod;
}
}
printf("%lld",(s1[n][ld]+mod-1)%mod);
return 0;
}

BZOJ 4584 【APIO2016】 赛艇的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ4584】[Apio2016]赛艇 DP

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

  5. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

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

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

  7. BZOJ4584 : [Apio2016]赛艇

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

  8. APIO2016赛艇

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

  9. bzoj 4585: [Apio2016]烟火表演【左偏树】

    参考:https://blog.csdn.net/wxh010910/article/details/55806735 以下课件,可并堆部分写的左偏树 #include<iostream> ...

随机推荐

  1. AtCoder Beginner Contest 084(AB)

    A - New Year 题目链接:https://abc084.contest.atcoder.jp/tasks/abc084_a Time limit : 2sec / Memory limit  ...

  2. GoldenGate 12.3 MA架构介绍系列(1) - 安装

    GoldenGate 12.3微服务架构与传统架构的区别可参考: http://www.cnblogs.com/margiex/p/7439574.html 下载地址:http://www.oracl ...

  3. linux下的route命令

    语法: route [-CFvnee] route [add|del]  [-net|-host] [网络或主机] netmask [gw|dev] route  [-V] [--version] [ ...

  4. yocto doc

    Yocto Project Overview and Concepts Manual https://www.yoctoproject.org/docs/2.6.1/overview-manual/o ...

  5. Android几种解析XML方式的比较

    https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用 ...

  6. linux装sqlite3

    下载sqlite3源码包 tar xvfz sqlite-src-3.3.5 cd sqlite-3.3.5 ./configure –no-tcl make python继续一次. apt inst ...

  7. OL6.3 设置本地yum源

    仅在 Oracle Linux Server release 6.3 上测试 PS:Oracle Linux Server release 6.3仅用于测试,不能用于商业用途 [root@oracle ...

  8. 写给大忙人的Elasticsearch架构与概念(未完待续)

    最新版本官方文档https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html文档增删改参考https://www ...

  9. MySql数据库概念

    一.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行 ...

  10. python之内置函数与匿名函数

    一内置函数 # print(abs(-1)) # print(all([1,2,'a',None])) # print(all([])) #bool值为假的情况:None,空,0,False # # ...