题面传送门

一道难度中等的 \(dp\)(虽然我没有想出来/kk)。

首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转移也异常显然,枚举上一个派出游艇的学校以及它派出的划艇个数,那么有 \(dp_{i,j}=\sum\limits_{k<i}\sum\limits_{l<j}dp_{k,l}\),这样暴力复杂度是 \(n^2A^2\),其中 \(A=\max\{a_i,b_i\}\),可以使用前缀和优化,但照样不能通过,复杂度 \(n^2A\) 或者 \(nA\)。

考虑优化,一个非常简单的想法是离散化,这样值域大小可以降到 \(\mathcal O(n)\),具体来说我们将所有 \(b_i\) 加 \(1\),这样每个学校派出游艇个数的范围就是一个左闭右开的区间 \([a_i,b_i)\),我们将它离散化一下然后用一个数表示一段左开右闭的区间,然后设 \(dp_{i,j}\) 表示到第 \(i\) 个学校,第 \(i\) 个学校派出的游艇个数在第 \(j\) 个区间中的方案数,不过这样就不太好直接按照上面的方式转移了:对于上一个派出游艇的学校,如果它派出的游艇个数不在第 \(j\) 个区间中那倒还好,可以直接加上去,但如果它派出的游艇个数刚好在第 \(j\) 个区间中,那就没啥办法直接计算贡献了。因此我们换个枚举方式:枚举上一个派出了游艇,且派出游艇个数不在第 \(j\) 个区间中的学校 \(k\),以及它派出的游艇个数所在的区间 \(l\),假设第 \(j\) 个区间长度为 \(len\),\((k,l]\) 中有 \(c\) 个学校派出游艇个数取值范围与第 \(j\) 个区间有交,那么方案数就是 \(\sum\limits_{t=0}^{c-1}\dbinom{c-1}{t}\times\dbinom{len}{t+1}=\sum\limits_{t=0}^{c-1}\dbinom{c-1}{c-1-t}\times\dbinom{len}{t+1}\),根据范德蒙德卷积,后面那东西就是 \(\dbinom{c-1+len}{c}\),于是 \(dp_{i,j}=\sum\limits_{k<i}\sum\limits_{l<j}dp_{k,l}\times\dbinom{c-1+len}{c}\),第二维 \(l\) 显然可以前缀和优化掉,复杂度 \(n^3\)。

const int MAXN=500;
const int MOD=1e9+7;
int n,a[MAXN+5],b[MAXN+5],key[MAXN*2+5],cnt=0,uni[MAXN*2+5],num=0;
int dp[MAXN+5],inv[MAXN+5];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
key[++cnt]=a[i];key[++cnt]=++b[i];
} sort(key+1,key+cnt+1);
for(int i=1;i<=cnt;i++) if(key[i]^key[i-1]) uni[++num]=key[i];
for(int i=1;i<=n;i++){
a[i]=lower_bound(uni+1,uni+num+1,a[i])-uni;
b[i]=lower_bound(uni+1,uni+num+1,b[i])-uni;
} dp[0]=1;
for(int i=(inv[0]=inv[1]=1)+1;i<=n;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<num;i++){
int len=uni[i+1]-uni[i];
for(int j=n;j;j--) if(a[j]<=i&&i<b[j]){
for(int k=j-1,cur=len,cnt=1;~k;k--){
dp[j]=(dp[j]+1ll*cur*dp[k])%MOD;
if(a[k]<=i&&i<b[k]) ++cnt,cur=1ll*cur*(len+cnt-1)%MOD*inv[cnt]%MOD;
}
}
} int ans=0;
for(int i=1;i<=n;i++) ans=(ans+dp[i])%MOD;
printf("%d\n",ans);
return 0;
}

洛谷 P3643 - [APIO2016]划艇(dp)的更多相关文章

  1. [洛谷P3643] [APIO2016]划艇

    洛谷题目链接:[APIO2016]划艇 题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 \(N\) 个划艇学校,编号依次为 \(1\) 到 \(N\).每个学校都拥有若干艘 ...

  2. 洛谷P3643 [APIO2016]划艇(组合数学)

    题面 传送门 题解 首先区间个数很少,我们考虑把所有区间离散化(这里要把所有的右端点变为\(B_i+1\)代表的开区间) 设\(f_{i,j}\)表示考虑到第\(i\)个学校且第\(i\)个学校必选, ...

  3. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  4. P3643 [APIO2016]划艇

    P3643 [APIO2016]划艇 题意 一个合法序列可表示为一个长度为 \(n\) 的序列,其中第 \(i\) 个数可以为 0 或 \([l_i,r_i]\) 中一个整数,且满足所有不为零的数组成 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

  7. 洛谷P1244 青蛙过河 DP/思路

    又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...

  8. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  9. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

随机推荐

  1. JSP(java server pages)安装开发和执行环境

    JSP是一种动态网页技术标准. 它是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag)的.jsp文件: java程序段:操纵数据库,重新定向网页,发送email等 ...

  2. the Agiles Scrum Meeting 8

    会议时间:2020.4.16 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成个人项目创建的部分功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增 ...

  3. spring cloud config 结合 spring cloud bus实现配置自定的刷新

    在线上环境中,有时候我们希望系统中的某些配置参数在修改后,可以立即生效而不用重新启动服务.由上一节我们知道,我们可以把配置文件统一放到配置服务中进行管理,这一节我们在配置中心中整合spring clo ...

  4. 如何洗白xi校长?(初稿)

    看看咱们太子殿下,谁还敢黑全世界最好的太子殿下 我们不如来考虑一下如何给校长洗白. 第一当然是买断热搜了.买断热搜可以阻止消息进一步传播.当然这种操作学校再8月18日晚就已经做过了.8月18日该条消息 ...

  5. WPF PropertyChanged实现子属性通知

    今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...

  6. cf17A Noldbach problem(额,,,素数,,,)

    题意: 判断从[2,N]中是否有超过[包括]K个数满足:等于一加两个相邻的素数. 思路: 枚举. 也可以:筛完素数,枚举素数,直到相邻素数和超过N.统计个数 代码: int n,k; int prim ...

  7. POJ 1442 Air Raid(DAG图的最小路径覆盖)

    题意: 有一个城镇,它的所有街道都是单行(即有向)的,并且每条街道都是和两个路口相连.同时已知街道不会形成回路. 可以在任意一个路口放置一个伞兵,这个伞兵会顺着街道走,依次经过若干个路口. 问最少需要 ...

  8. vue3.x版本路由router跳转+传参

    显示传参模式 get import { useRouter } from 'vue-router'; const router = useRouter(); let skipEdit = (key: ...

  9. vivo 全球商城:商品系统架构设计与实践

    一.前言 随着用户量级的快速增长,vivo官方商城v1.0的单体架构逐渐暴露出弊端:模块愈发臃肿.开发效率低下.性能出现瓶颈.系统维护困难. 从2017年开始启动的v2.0架构升级,基于业务模块进行垂 ...

  10. sprint boot 手动快速创建web应用(2)

    1.打开Eclipse新建maven项目 2.导入maven依赖 <parent> <groupId>org.springframework.boot</groupId& ...