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的合法排列个 ...
随机推荐
- Linux分享笔记:shell终端的介绍
[1] Linux中 “shell终端” 和 “bash解释器” 的区别 shell终端是通过基于系统调用接口开发出的程序,用来让用户与系统进行对话,管理计Linux系统.它是一个命令行工具,操作类似 ...
- 浅谈localStorage的用法
今天接到一个任务,说是让自动调节textarea标记的输入高度,而且还要记录下来,下次登录的时候还是调节后的高度,我第一时间就想到了localStorage的用法,直接代码献上: <html l ...
- C#中的线程(二)线程同步基础 (读后感)
参考文章:https://www.cnblogs.com/dingfangbo/p/5769501.html 一.lock 确保只有一个线程访问某个资源或某段代码.通俗的讲就是多个线程操作相同的锁对象 ...
- php GD 圆图 -处理成圆图片
<?php /** * 处理成圆图片,如果图片不是正方形就取最小边的圆半径,从左边开始剪切成圆形 * @param string $imgpath [description] * @return ...
- Laravel -- 模型
模型文件 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { / ...
- count_char
import java.util.Scanner; public class count_char { public static void main(String args[]) { int cou ...
- 配置vue-yarm-PM2工具环境
步骤: 第一步:安装yarn 参考网址:https://yarn.bootcss.com/docs/install.html#linux-tab a.用pm2启动已创建的server.js #pm ...
- angularjs post data
//post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置 headers: { 'Content-Type': 'application/x- ...
- java 堆栈内存分析详解
计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...
- KMP python实现
首先去 https://blog.csdn.net/starstar1992/article/details/54913261/ 这里看下思想: 然后代码实现,一定要多调试几遍方能看懂: def ge ...