【loj2567】【APIO2016】划艇
题目
\(N\)个位置,每个位置要么不选,要么选\([ a_i, b_i ]\)中的一个数;
问最后的单调上升序列(mod 1e9+7)有多少种;
\(1 \le N \le 500\)
题解
orz abclzr
直接\(dp\)最后一位是什么数字的话只能得到31分
将数字离散化分段,第\(i\)段为\([l_i,r_i)\),设\(f_{i,j}\)表示第i个位置选的数字在第j段的方案数(第0段表示没有)
\[f_{i,j} \ = \sum_{k=0}^{i-1} \sum_{l=0}^{j-1} f_{k,l} \times cal(k+1,i,j) \\
ans = \sum_{i=1}^n \sum_{j=1}^m f_{i,j} \\
\]其中 $ cal(l,r,x) $ 表示 $ [l,r) $ 都不选或者选在第j段并且单调上升的方案数
设 $ [ l,r) $ 这里面有 $ S $ 个包含x区间,x区间的长度为 $ L $
\[cal(l,r,x) = \sum_{i=0}^{S}(^S_i)(^L_{i+1}) = \sum_{i=0}^{S}(^S_{S-i})(^L_{i+1}) \\
思考组合意义:左边选S-i个再在右边选i+1个相当与一起选S+1个\\
cal(l,r,x) = (^{S+L}_{S+1}) \\
\]前缀和优化dp即可:\(O(n^3)\)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010,mod=1e9+7;
int n,tot,sub[N],L[N],R[N],ny[N],l[N],f[N][N];
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
int main(){
// freopen("boat.in","r",stdin);
// freopen("boat.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d",&L[i],&R[i]);
sub[++tot]=L[i];
sub[++tot]=++R[i];
}
sort(sub+1,sub+tot+1);
tot=unique(sub+1,sub+tot+1)-sub-1;
for(int i=1;i<=n;++i){
L[i]=lower_bound(sub+1,sub+tot+1,L[i])-sub;
R[i]=lower_bound(sub+1,sub+tot+1,R[i])-sub;
}
ny[1]=1;for(int i=2;i<=n;++i)ny[i]=(ll)(mod-mod/i)*ny[mod%i]%mod;
for(int i=0;i<tot;++i)f[0][i]=1;
for(int i=1;i<tot;++i)l[i]=sub[i+1]-sub[i];
for(int i=1;i<=n;++i){
for(int j=L[i];j<R[i];++j){
int C=l[j],a=l[j],b=1;
for(int k=i-1;~k;--k){
inc(f[i][j],(ll)f[k][j-1]*C%mod);
if(L[k]<=j&&j<R[k])C=(ll)C*(++a)%mod*ny[++b]%mod;
}
}
for(int j=1;j<tot;++j)inc(f[i][j],f[i][j-1]);
}
int ans=0;for(int i=1;i<=n;++i)inc(ans,f[i][tot-1]);
cout<<ans<<endl;
return 0;
}
//菜兔兔写的部分分
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=510,M=2000010,mod=1e9+7;
int n,a[N],b[N],len[N],sub[M],tot;
int f[M],g[M];
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
int main(){
// freopen("boat.in","r",stdin);
// freopen("boat.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d",&a[i],&b[i]);
for(int j=a[i];j<=b[i];++j)sub[++tot]=j;
}
sort(sub+1,sub+tot+1);
tot=unique(sub+1,sub+tot+1)-sub-1;
f[0]=1;for(int i=0;i<=tot;++i)g[i]=1;
for(int i=1;i<=n;++i){
a[i]=lower_bound(sub+1,sub+tot+1,a[i])-sub;
b[i]=lower_bound(sub+1,sub+tot+1,b[i])-sub;
for(int j=a[i];j<=b[i];++j)f[j]=g[j];
for(int j=a[i];j<=tot;++j)inc(g[j]=f[j],g[j-1]);
}
cout<<g[tot]-1<<endl;
return 0;
}
【loj2567】【APIO2016】划艇的更多相关文章
- [洛谷P3643] [APIO2016]划艇
洛谷题目链接:[APIO2016]划艇 题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 \(N\) 个划艇学校,编号依次为 \(1\) 到 \(N\).每个学校都拥有若干艘 ...
- P3643 [APIO2016]划艇
P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...
- [APIO2016]划艇
题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...
- 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\)[ ...
随机推荐
- 【SpringBoot】SpingBoot整合AOP
https://blog.csdn.net/lmb55/article/details/82470388 [SpringBoot]SpingBoot整合AOPhttps://blog.csdn.net ...
- 安卓自定义View基础 --坐标系,角度弧度,颜色
转自:https://www.gcssloop.com/customview/CustomViewIndex/ 1.坐标系 2.角度弧度 3.颜色 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定 ...
- Python进阶----GIL锁,验证Cpython效率(单核,多核(计算密集型,IO密集型)),线程池,进程池
day35 一丶GIL锁 什么是GIL锁: 存在Cpython解释器,全名:全局解释器锁.(解释器级别的锁) GIL是一把互斥锁,将并发运行变成串行. 在同一个进程下开启的多个线 ...
- python基础之猜数字游戏
#猜数字游戏 import random #impor语句导入random模块 guessor=0; print("#"*30) #输出30个”#“(”############## ...
- python多任务的实现:线程,进程,协程
什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后 ...
- Linu如何查看磁盘占用情况及处理办法
free -h: 查看当前剩余的内存大小 df: 查看文件系统磁盘使用率,可能free -h得到的剩余空间还有很多,但是df查询得到的部分文件系统磁盘使用率较高 当发现磁盘使用率较高的时候,可以: 先 ...
- [LeetCode] 538. 把二叉搜索树转换为累加树 ☆(中序遍历变形)
把二叉搜索树转换为累加树 描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. ...
- PHP微信商户支付企业付款到零钱功能
一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...
- Unicode字符集的由来
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- Docker-compose(创建容器)
Docker-compose(创建容器) 本文原始地址:https://sitoi.cn/posts/23955.html 样例 version: "2" services: sp ...