UOJ#204 【APIO2016】Boat
Time Limit: 70 Sec Memory Limit: 256 MB
Submit: 559 Solved: 248
Description
Input
第一行包括一个整数N,表示学校的数量。接下来N行,每行包括两个正整数,用来描述一所学校。其中第行包括的
Output
输出一行,一个整数,表示所有可能的派出划艇的方案数除以1,000,000,007得到的余数
Sample Input
1 2
2 3
Sample Output
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的更多相关文章
- UOJ #206. 【APIO2016】Gap
Description Solution 第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\) 第二个 ...
- UOJ#206. 【APIO2016】Gap 构造 交互题
原文链接www.cnblogs.com/zhouzhendong/p/UOJ206.html 题解 T = 1 的情况直接大力从两边向中间询问即可. T = 2 的情况挺妙的,我没想到. 考虑首先花费 ...
- UOJ#206. 【APIO2016】Gap(交互,乱搞)
描述 提交 自定义测试 有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤101 ...
- UOJ #206. 【APIO2016】Gap【交互题】
参考:https://blog.csdn.net/clover_hxy/article/details/70767653 人生第一次交互题...不是很难但是思维和传统题差别挺大的(以及并不会本地测试= ...
- uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)
[题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...
- uoj #5. 【NOI2014】动物园 kmp
#5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...
- UOJ #148. 【NOIP2015】跳石头 二分
#148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...
- UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
随机推荐
- lintcode-186-最多有多少个点在一条直线上
186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- OSG数学基础:坐标系变换
三维实体对象需要经过一系列的坐标变换才能正确.真实地显示在屏幕上.在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的. 坐标系变换通常包括:世界坐标系-物体坐标系变换. ...
- ZOJ 1403 F-Safecracker
https://vjudge.net/contest/67836#problem/F "The item is locked in a Klein safe behind a paintin ...
- Python2中编码错误---éç»äººè¡¨ç®çé¿å ååè¶(æå格式转化为UTF-8
在python2的使用中,总会遇到各种各样的编码问题,这也是使用Python2最头疼的一件事情,幸好python3解决了编码的问题. 下面我在爬虫时遇到的类似éç»äººè¡¨ç®çé¿ ...
- vs中编译连接时的警告屏蔽
编译警告类型为warning C4996的形式 可以采用的#pragma warning(disable:4996)屏蔽掉这种编译警告 连接警告类型为warning LNK4049的形式 这是由于不同 ...
- CURL & Fetch
CURL & Fetch https://kigiri.github.io/fetch/ https://stackoverflow.com/questions/31039629/conver ...
- 限制玻尔兹曼机(Restricted Boltzmann Machine)RBM
假设有一个二部图,每一层的节点之间没有连接,一层是可视层,即输入数据是(v),一层是隐藏层(h),如果假设所有的节点都是随机二值变量节点(只能取0或者1值)同时假设全概率分布满足Boltzmann 分 ...
- BZOJ4709 JSOI2011柠檬(动态规划)
首先要冷静下来发现这仅仅是在划分区间.显然若有相邻的数字相同应当划分在同一区间.还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数.瞬间暴力dp就变成常数极小100002了.可以继续斜率优化 ...
- 【转】PowerDesigner中Table视图同时显示Code和Name
为避免图片失效,文字描述, Tools-Display Preference-->左侧Table-->右下角Advanced-->左侧树Columns-->右侧上面第一个放大镜 ...
- 【题解】洛谷9月月赛加时赛 —— Never·island
有趣有趣~ヾ(✿゚▽゚)ノ真的很有意思的一道dp题!感觉可以提供很多非常有意思的思路~ 现场打的时候考虑了很久,但并没有做出来,主要还是卡在了两个地方:1.考虑到按照端点来进行dp,但没有办法将两个端 ...