Time Limit: 70 Sec  Memory Limit: 256 MB
Submit: 559  Solved: 248

Description

在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到。每个学校都
拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一
样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为的学校选择
派出划艇参加庆典,那么,派出的划艇数量可以在Ai至Bi之间任意选择(Ai<=Bi)。值得注意的是,编号为i的学
校如果选择派出划艇参加庆典,那么它派出的划艇数量必须大于任意一所编号小于它的学校派出的划艇数量。输入
所有学校的Ai、Bi的值,求出参加庆典的划艇有多少种可能的情况,必须有至少一艘划艇参加庆典。两种情况不同
当且仅当有参加庆典的某种颜色的划艇数量不同

Input

第一行包括一个整数N,表示学校的数量。接下来N行,每行包括两个正整数,用来描述一所学校。其中第行包括的

两个正整数分别表示Ai,Bi(1<=Ai<=Bi<=10^9),N<=500

Output

输出一行,一个整数,表示所有可能的派出划艇的方案数除以1,000,000,007得到的余数

Sample Input

2
1 2
2 3

Sample Output

7

HINT

Source

动态规划

看着题解懵X一个多小时,我这么弱已经没救了吧

枚举数量显然无力,我们得考虑将整段区间一起处理,于是先将区间离散化

将派船看作在限定区间里选一个数,设f[i][j][k]表示当前枚举到第i个学校,最大船数在第j段,这段里选了k个数的方案数。

$ f[i][j][k]=f[i-1][j][k]+f[i-1][j][k-1]* \frac {C(len[j],k)}{C(len[j],k-1)} $

特殊处理 $ f[i][j][1]=f[i-1][j][1] + (\sum_{a=1}^{j-1}  \sum_{k=0}^{i-1} f[i-1][a][k] )*len[j] $

第一维可以滚动优化掉

第一个式子的组合数,约分一下变成了(len-k+1)/k ,预处理500以内的逆元即可。

第二个式子用前缀和优化。

然后大概就能过了

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mod=1e9+;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int inv[mxn];
void init(){
inv[]=inv[]=;
for(int i=;i<mxn;i++){
inv[i]= ((-mod/i)*(LL)inv[mod%i]%mod+mod)%mod;
}
return;
}
int n;
int c[mxn][mxn];
struct seg{
int L,R;
}a[mxn];
int pos[mxn],sz=,len[mxn];
int f[mxn][mxn],g[mxn];
int num[mxn];
int main(){
// freopen("boat.in","r",stdin);
// freopen("boat.out","w",stdout);
int i,j;
n=read();
init();
for(i=;i<=n;i++){
a[i].L=read()-;a[i].R=read();
pos[++sz]=a[i].L;pos[++sz]=a[i].R;
}
sort(pos+,pos+sz+);
sz=unique(pos+,pos+sz+)-pos-;
// for(i=1;i<=sz;i++)printf("%d",pos[i]);
for(i=;i<=n;i++){
a[i].L=lower_bound(pos+,pos+sz+,a[i].L)-pos;
a[i].R=lower_bound(pos+,pos+sz+,a[i].R)-pos;
}
for(i=;i<=sz;i++)len[i]=pos[i]-pos[i-];
f[][]=;
for(i=;i<=sz;i++)g[i]=;
for(i=;i<=n;i++){
for(j=a[i].L+;j<=a[i].R;j++){
num[j]++;
for(int k=num[j];k>;k--)
f[j][k]=((LL)f[j][k]+(LL)f[j][k-]*(len[j]-k+)%mod*(LL)inv[k])%mod;
f[j][]=((LL)f[j][]+(LL)g[j-]*len[j]%mod)%mod;
}
for(j=a[i].L+;j<=sz;j++){
g[j]=g[j-];
for(int k=num[j];k;k--){
g[j]=((LL)g[j]+f[j][k])%mod;
}
}
}
g[sz]--;if(g[sz]<=)g[sz]+=mod;
printf("%d\n",g[sz]);
return ;
}

UOJ#204 【APIO2016】Boat的更多相关文章

  1. UOJ #206. 【APIO2016】Gap

    Description Solution 第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\) 第二个 ...

  2. UOJ#206. 【APIO2016】Gap 构造 交互题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ206.html 题解 T = 1 的情况直接大力从两边向中间询问即可. T = 2 的情况挺妙的,我没想到. 考虑首先花费 ...

  3. UOJ#206. 【APIO2016】Gap(交互,乱搞)

    描述 提交 自定义测试 有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤101 ...

  4. UOJ #206. 【APIO2016】Gap【交互题】

    参考:https://blog.csdn.net/clover_hxy/article/details/70767653 人生第一次交互题...不是很难但是思维和传统题差别挺大的(以及并不会本地测试= ...

  5. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  6. uoj #5. 【NOI2014】动物园 kmp

    #5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...

  7. UOJ #148. 【NOIP2015】跳石头 二分

    #148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...

  8. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  9. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

随机推荐

  1. 软工冲刺-Alpha 冲刺 (3/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...

  2. Ubuntu下FileZilla的安装

    FileZilla是一个免费而且开源的FTP客户端软件,共有两种版本:客户端版本.服务器版本.FileZilla有条理的界面和管理多站点的简化方式使得FileZilla Client成为一个方便高效的 ...

  3. 关于GenericJDBCException的问题

    在spring和hibernate整合的初步阶段,还没有编辑hibernate.cfg.xml这个文件,只有一个beans.xml文件.此时遇到了一个bug. Exception in thread ...

  4. ALPHA-3

    前言 失心疯病源3 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 16:00~20:18 援助行人模块并确定最终框架,顺便不死心的又找了一波车辆检测的dem ...

  5. 项目--uml

    [团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...

  6. 第三章——供机器读取的数据(CSV与JSON)

    本书使用的文件.代码:https://github.com/huangtao36/data_wrangling 机器可读(machine readable)文件格式: 1.逗号分隔值(Comma-Se ...

  7. 2-c语言作业1

    #include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sun; pri ...

  8. MySQL中的条件语句

    判断学生表中成绩是否小于60,将小于60的学生成绩列为不及格 学生表(student) 字段:姓名(name),学号(主键)(num),性别(sex),成绩(score) select *,if(sc ...

  9. 【bzoj1036】[ZJOI2008]树的统计Count 树链剖分+线段树

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...

  10. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...