参考:https://www.cnblogs.com/lcf-2000/p/6809085.html

设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数

把数量区间离散化,转移是:

当k==1

\[f_{i,j,k}=\sum_{i'=1}^{i-1}\sum_{j'=1}^{j-1}\sum_{k'=1}^{i'}f_{i',j',k'}
\]

否则

\[f_{i,j,k}=C_{len_j}^k\frac{\sum_{i'=1}^{i-1}f_{i',j,k}}{C_{len_j}^{k-1}}
\]

\[f_{i,j,k}=\frac{C_{len_j}^k}{C_{len_j}^{k-1}}\sum_{i'=1}^{i-1}f_{i',j,k}
\]

\[f_{i,j,k}=\frac{len_j-k+1}{k}\sum_{i'=1}^{i-1}f_{i',j,k}
\]

然后这个空间是不行的,所以用二维前缀和优化

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=1005,mod=1e9+7;
int n,l[N],r[N],inv[N],g[N],tot,has,h[N],f[N][N],s[N][N];
map<int,int>mp;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
inline void add(int &x,int y)
{
x+=y;
if(x>=mod)
x-=mod;
}
int main()
{
n=read();
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
inv[0]=1;
for(int i=1;i<=n;i++)
{
l[i]=read(),r[i]=read()+1;
g[++tot]=l[i],g[++tot]=r[i];
}
sort(g+1,g+1+tot);
for(int i=1;i<=tot;i++)
if(i==1||g[i]!=g[i-1])
mp[g[i]]=++has,h[has]=g[i];
for(int i=1;i<=n;i++)
l[i]=mp[l[i]],r[i]=mp[r[i]];
for(int i=0;i<=has;i++)
f[0][i]=1;
for(int i=1,x,y;i<=n;i++)
{
for(int j=r[i]-1;x=h[j+1]-h[j],j>=l[i];j--)
{
for(int k=min(x,i);k>1;k--)
{
y=1ll*s[j][k-1]*inv[k]%mod*(x-k+1)%mod;
add(f[i][j],y);
add(s[j][k],y);
}
y=1ll*f[i-1][j-1]*x%mod;
add(f[i][j],y);
add(s[j][1],y);
}
f[i][0]=1;
for(int j=1;j<=has;j++)
{
add(f[i][j],(f[i-1][j]+f[i][j-1])%mod);
f[i][j]=(f[i][j]-f[i-1][j-1])%mod;
if(f[i][j]<0)
f[i][j]+=mod;
}
}
printf("%d\n",(f[n][has]+mod-1)%mod);
return 0;
}

bzoj 4584: [Apio2016]赛艇【dp】的更多相关文章

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

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

  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】 赛艇

    题目链接:赛艇 讲道理好好的Boat为啥要翻译成赛艇呢……题面中不也是划艇么…… 这道题考虑一下dp.由于划艇数量过于庞大,所以肯定不能直接记录到dp状态中.所以一个想法就是把数量离散化,然后把每个学 ...

  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. [BZOJ 3791] 作业 【DP】

    题目链接:BZOJ - 3791 题目分析 一个性质:将一个序列染色 k 次,每次染连续的一段,最多将序列染成 2k-1 段不同的颜色. 那么就可以 DP 了,f[i][j][0|1] 表示到第 i ...

  7. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

    题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...

  8. BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)

    BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...

  9. BZOJ 4380 [POI2015]Myjnie | DP

    链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...

随机推荐

  1. mysql 常用管理命令

    常见的管理mysql命令 (1)用于选择在MySQL工作区指定的数据库(选择数据库): USE Databasename; (2)列出了MySQL数据库管理系统中的所有可访问的数据库: SHOW DA ...

  2. 牛客网暑期ACM多校训练营(第九场) A题 FWT

    链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...

  3. PAT (Advanced Level) 1038. Recover the Smallest Number (30)

    注意前导零的消去. #include <iostream> #include <string> #include <sstream> #include <al ...

  4. SQL SERVER 2008破解加密存储过程(修正存储过程过长解密出来是空白的问题)

    SQLServer2005里使用with encryption选项创建的存储过程仍然和sqlserver2000里一样,都是使用XOR进行了的加密.和2000不一样的是,在2005的系统表syscom ...

  5. java基础语法——方法,static关键字

    一:方法: 1.什么是方法: 通俗地讲,方法就是行为.它是完成特定功能的代码块能执行一个功能.它包含于类和对象中. 2.为什么要有方法: *提高代码的复用性. *提高效率 *利于程序维护 3.命名规则 ...

  6. Java实验--继承与多态

    ---恢复内容开始--- 题目如下: [实验任务一]:面积计算(设计型). 1. 实验要求: 实验报告中要求包括程序设计思想.程序流程图.源代码.运行结果截图.编译错误分析等内容. 2.实验内容: ( ...

  7. 一次mysql 优化 (Using temporary ; Using filesort)

    遇到一个SQL执行很慢 SQL 如下: SELECT ... FROM tableA WHERE time >= 1492044535 and time <= 1492046335 GRO ...

  8. 将oracle10g 升级至10.2.0.4

    http://blog.csdn.net/launch_225/article/details/7221489 一.单实例环境,全时长一个半钟多. 详细图文说明到这下载 1.停止所有oracle相关进 ...

  9. poj 1695 Magazine Delivery 记忆化搜索

    dp[a][b][c],表示三个人从小到大依次在a,b.c位置时.距离结束最少的时间. 每次选一个人走到c+1位置搜索就好了. 坑点在于不能floyd.预计题目没说清楚.意思就是假设没送Li,那么Li ...

  10. Office EXCEL 如何实现在单元格内换行

    按A/T+回车可以实现手动换行