BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化。于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散化后)相同的学校是哪个,考虑这一段里选几个学校怎么选数,组合数即可。各种显然的优化后即可做到O(n3),瞎卡卡常就……根本过不了。被卡常已经习惯了。不要把有限的生命投入无限的卡常之中。越菜的人越容易被卡常。——沃兹基硕德。luogu8s,darkbzoj40s,bzoj?s。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 510
#define P 1000000007
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int n,a[N],b[N],f[N][N<<],g[N][N<<],C[N][N],c[N],h[N<<][N],u[N<<],v[N<<],l[N<<],r[N<<],last[N][N<<],tot[N<<],t;
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int inv(int a)
{
int s=,k=P-;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
void pre()
{
sort(v+,v+t+);
t=unique(v+,v+t+)-v-;int t2=;
u[++t2]=v[];l[t2]=r[t2]=v[];
for (int i=;i<=t;i++)
{
if (v[i]-!=v[i-]) u[++t2]=v[i]-,l[t2]=v[i-]+,r[t2]=v[i]-;
u[++t2]=v[i],l[t2]=v[i],r[t2]=v[i];
}
t=t2;memcpy(v,u,sizeof(v));
for (int i=;i<=n;i++) a[i]=lower_bound(v+,v+t+,a[i])-v,b[i]=lower_bound(v+,v+t+,b[i])-v;
for (int i=;i<=t;i++)
{
int l=;
for (int j=;j<=n;j++)
if (a[j]<=i&&i<=b[j]) last[j][i]=l,tot[i]++,l=j;
else last[j][i]=;
}
}
void calc()
{
C[][]=;
for (int i=;i<=n;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++) C[i][j]=(C[i-][j-]+C[i-][j])%P;
}
for (int i=;i<=t;i++)
{
memset(c,,sizeof(c));
c[]=;
for (int j=;j<=n&&j<=r[i]-l[i]+;j++)
c[j]=1ll*c[j-]*(r[i]-l[i]+-j+)%P*inv(j)%P;
for (int j=;j<=tot[i];j++)
for (int p=;p<=j;p++)
inc(h[i][j],1ll*C[j-][p-]*c[p]%P);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4584.in","r",stdin);
freopen("bzoj4584.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) v[++t]=a[i]=read(),v[++t]=b[i]=read();
pre();calc();
f[][]=;for (int i=;i<=t;i++) g[][i]=;
for (int i=;i<=n;i++)
{
for (int j=a[i];j<=b[i];j++)
{
f[i][j]=1ll*g[i-][j-]*(r[j]-l[j]+)%P;
int cnt=;
for (int k=last[i][j];k;k=last[k][j])
inc(f[i][j],1ll*g[k-][j-]*h[j][++cnt]%P);
}
for (int j=;j<=t;j++) g[i][j]=(g[i][j-]+f[i][j])%P;
for (int j=;j<=t;j++) inc(g[i][j],g[i-][j]);
}
cout<<(g[n][t]+P-)%P;
return ;
}
BZOJ4584 APIO2016赛艇(动态规划+组合数学)的更多相关文章
- BZOJ4584 : [Apio2016]赛艇
首先将值域离散化成$O(n)$个连续段. 设$f[i][j][k]$表示第$i$个学校派出的数量在第$j$个连续段,在第$j$个连续段一共有$k$个学校的方案数.用组合数以及前缀和转移即可. 时间复杂 ...
- BZOJ 4584 [Apio2016]赛艇 ——动态规划
Subtask 1 直接$N^2$ $DP$,就可以了 Subtask 2 用$f[i][j]$表示当前位置为$i$,结束元素为$j$的方案数. Subtask 3 看下面 Subtask 4 首先可 ...
- 【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 在首尔 ...
- [POJ1664] 放苹果 (动态规划,组合数学)
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= ...
- bzoj 4584: [Apio2016]赛艇【dp】
参考:https://www.cnblogs.com/lcf-2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数 ...
- Codeforces 979E Kuro and Topological Parity - 动态规划 - 组合数学
题目传送门 传送点 题目大意 给定$n$个标号依次为$1, 2, \cdots, n$的点,其中一些点被染成一些颜色,剩下的点没有染色.你需要添加一些有向边并将剩下的点染色,满足有向边从编号小的一端指 ...
- APIO2016赛艇
首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当 ...
- BZOJ5416 NOI2018冒泡排序(动态规划+组合数学)
打表可以发现相当于不存在长度>=3的递减子序列. 考虑枚举在哪一位第一次不卡限制.注意到该位一定会作为前缀最大值.判掉已确定位不合法的情况后,现在的问题即为求长度为i.首位>j的合法排列个 ...
随机推荐
- mysql-介绍
1.mysql几个重要的文件 每个数据库新建后,会产生数据库文件夹,在该文件夹下每张表均对应以下三个文件: xx.frm 存放表结构 xx.MYD 存放表数据 xx.MYI 存放表索引 mys ...
- Python起源与发展
Python的创始人为吉多*范罗苏姆(Gudio van Rossum) 1.1989年的圣诞节期间,吉多*范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的解释程序,作为ABC语言的一种继承. 2. ...
- 使用mysql5.7版本数据库需要注意的地方/持续更新
数据库mysql 5.7版本的初始密码修改 安装完后实在是找不到初始密码的文件,后面发现再错误日志中 先关闭mysql pkill mysqld 安全模式启动数据库并修改密码 mysqld_safe ...
- JSOI2018 R1 & 九省联考2018 滚粗记
在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...
- C#中Equals和= =(等于号)的比较)(转载)
C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一. 值类型的比较 对于值类型来说 ...
- 1.使用pycharm搭建开发调试环境【转】
感谢 feigamesnb 第一步:安装python2.7环境 去https://www.python.org/downloads/下载windows版本的python,选择2.7版本,按提示安装,并 ...
- 2 socket UDP通信
1 socket套接字 class 对象 In [1]: import socket In [2]: help(socket.socket) class socket(_socket.socket) ...
- 超强排序JavaScript插件
Sortable:http://rubaxa.github.io/Sortable/
- 《Cracking the Coding Interview》读书笔记
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
- android中的AIDL学习笔记
一.定义 AIDL是用来解决进程间通信的(一般有四种方式:Activity.Service.ContentProvider.Broadcast Receiver),两个进程间无法直接通信,所以要用AI ...