[APIO2016]划艇
题目描述
在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN。每个学校都拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为 iii 的学校选择派出划艇参加庆典,那么,派出的划艇数量可以在 aia_iai 至 bib_ibi 之间任意选择(ai≤bia_i \leq b_iai≤bi)。
值得注意的是,编号为 iii 的学校如果选择派出划艇参加庆典,那么它派出的划艇数量必须大于任意一所编号小于它的学校派出的划艇数量。
输入所有学校的 ai,bia_i,b_iai,bi 的值,求出参加庆典的划艇有多少种可能的情况,必须有至少一艘划艇参加庆典。两种情况不同当且仅当有参加庆典的某种颜色的划艇数量不同。
输入输出格式
输入格式:
第一行包括一个整数 NNN,表示学校的数量。
接下来 NNN 行,每行包括两个正整数,用来描述一所学校。其中第 iii 行包括的两个正整数分别表示 ai,bia_i,b_iai,bi(1≤ai≤bi≤1091 \leq a_i \leq b_i \leq 10^91≤ai≤bi≤109)。
输出格式:
输出一行,一个整数,表示所有可能的派出划艇的方案数除以 1,000,000,0071,000,000,0071,000,000,007 得到的余数。
输入输出样例
2
1 2
2 3
7
说明
【样例解释】
在只有一所学校派出划艇的情况下有 444 种方案,两所学校都派出划艇的情况下有 333 种方案,所以答案为 777。
【数据范围】
子任务 111(999 分):1≤N≤5001 \leq N \leq 5001≤N≤500 且对于所有的 1≤i≤N1 \leq i \leq N1≤i≤N,保证 ai=bia_i=b_iai=bi。
子任务 222(222222 分):1≤N≤5001 \leq N \leq 5001≤N≤500 且 ∑i=1N(bi−ai)≤106\sum_{i=1}^N (b_i-a_i) \leq 10^6∑i=1N(bi−ai)≤106。
子任务 333(272727 分):1≤N≤1001 \leq N \leq 1001≤N≤100。
子任务 444(424242 分):1≤N≤5001 \leq N \leq 5001≤N≤500。
http://m.blog.csdn.net/qq_22541499/article/details/51674707这个博客说的很清楚
组合数部分很难理解,建议手推一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int Mod=;
typedef long long lol;
lol A[],f[][],len[];
lol a[],b[],ge[],n,cnt;
int main()
{lol i,j,k;
cin>>n;
A[]=;
for (i=;i<=n;i++)
{
A[i]=(Mod-Mod/i)*A[Mod%i]%Mod;
}
for (i=;i<=n;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
ge[i]=a[i];ge[n+i]=b[i]+;
}
sort(ge+,ge+*n+);
for (i=;i<*n;i++)
{
if (ge[i]==ge[i+])
ge[i]=2e9;
}
sort(ge+,ge+*n+);
cnt=*n;
while (ge[cnt]==2e9) cnt--;
for (i=;i<=n;i++)
{
a[i]=upper_bound(ge,ge+cnt+,a[i])-ge;
b[i]=upper_bound(ge,ge+cnt+,b[i])-ge;
//cout<<a[i]<<' '<<b[i]<<endl;
}
for (i=;i<=cnt;i++)
{
f[][i]=;
if (i)
len[i]=ge[i]-ge[i-];
}
for (i=;i<=n;i++)
{
f[i][]=;
for (j=a[i];j<=b[i];j++)
{
f[i][j]=(f[i-][j-]*len[j])%Mod;
lol c=len[j]-,now=;
for (k=i-;k;k--)
{
if (j>=a[k]&&j<=b[k])
{
now++;
c=((c*(len[j]+now-)%Mod)*A[now])%Mod;
if (!c) break;
f[i][j]+=(f[k-][j-]*c)%Mod;
f[i][j]%=Mod;
}
}
}
for (j=;j<=cnt;j++)
{
f[i][j]=(f[i][j]+f[i-][j]+f[i][j-]-f[i-][j-]+Mod)%Mod;
}
}
cout<<(f[n][cnt]-+Mod)%Mod;
}
[APIO2016]划艇的更多相关文章
- [洛谷P3643] [APIO2016]划艇
洛谷题目链接:[APIO2016]划艇 题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 \(N\) 个划艇学校,编号依次为 \(1\) 到 \(N\).每个学校都拥有若干艘 ...
- P3643 [APIO2016]划艇
P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...
- BZOJ4584 & 洛谷3643 & UOJ204:[APIO2016]划艇——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4584 https://www.luogu.org/problemnew/show/P3643 ht ...
- 题解 P3643 [APIO2016]划艇
题解 一种思路很好想:\(f_{i,j}\) 表示前 \(i\) 所学校中,第 \(i\) 所学校参赛且派出 \(j\) 艘划艇的方案数.(转移就不列了.) 这种方式有一个致命点,就是 \(j\) 的 ...
- 洛谷 P3643 - [APIO2016]划艇(dp)
题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...
- 洛谷P3643 [APIO2016]划艇(组合数学)
题面 传送门 题解 首先区间个数很少,我们考虑把所有区间离散化(这里要把所有的右端点变为\(B_i+1\)代表的开区间) 设\(f_{i,j}\)表示考虑到第\(i\)个学校且第\(i\)个学校必选, ...
- [组合][DP]luogu P3643 [APIO2016]划艇
题面 https://www.luogu.com.cn/problem/P3643 对于一个序列,第i项可取的值在{0}∪[ai,bi]之间,求使序列非零部分单调递增的方案数 分析 设 $f[i][j ...
- Codeforces Educational Round 81 解题报告
前置扯淡 赛前:这场\(Div2\)呀,那我写\(3\)题就行,\(D\)题尽力就好 赛中:啊啊,\(ABC\)我全过了\(pretest\),我太强了!!这把上蓝稳了 赛后:\(woc\),为啥被\ ...
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
随机推荐
- 敏捷冲刺每日报告四(Java-Team)
第四天报告(10.28 周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- Bate版敏捷冲刺报告--day0
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- java第5章学习总结
学号20145336 <Java程序设计>第5周学习总结 教材学习内容总结 try catch JVM会先尝试执行try区块中的内容,若发生错误且与catch后面的类型相符,则执行catc ...
- js常用API方法
String对象常用的API:API指应用程序编程接口,实际上就是一些提前预设好的方法. charAt() 方法可返回指定位置的字符. stringObject.charAt(index) index ...
- Python-面向对象(一)-Day7
Day7-面向对象基础 1一.isinstance(obj, cls) 1二.issubclass(sub, super) 1三.异常处理 11.异常基础 12.异常种类 23.异常其他结构 54.主 ...
- Mego开发文档 - 复杂保存操作
复杂保存操作 Mego框架还提供了更强大的数据更新API,以简化开发工作,同时也保证的性能. 指定属性添加数据 本列中指定插入一个数据对象,并且只会插入三列数据,最后两个属性是以表达式的形式插入. u ...
- 新概念英语(1-135)The latest report
Lesson 135 The latest report 最新消息 Listen to the tape then answer this question. Is Karen Marsh going ...
- redux的使用过程
1.redux是react的状态管理工具,可以用来存放公共数据,因此也可用来作为组件间参数传递的方法. 2.组件传参,需要有一个公共的父组件.在父组件中引入Provider.通过Provider将 ...
- C# 读取网页JSON数据
场景描述: 公司和别的系统需要对接,现在对方提供一个网址,数据都是json字符串,我需要对json数据进行处理. 提供的json数据如下格式 一.读取网址中的json数据 public string ...
- Mac里安装配置Jdk
#下载jdk7的mac版 #官网下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.h ...