赛艇 题解

一颗赛艇

https://www.lydsy.com/JudgeOnline/problem.php?id=4584

虽然名字听起来很暴力(+1s),却是组合计数好题,在考试时都没有看出来是组合计数。

 

对于子任务1/2

区间的总长度不超过1e6,可以将区间内的每个数离散化到一个区间里。

于是可以写出一个简单的dp,

dp(i,j)表示到第i个学校,最多派出划艇数量为j的方案数,

简单的转移。

使用数状数组或线段树优化一下就可以做到O(NlogN),

最后将答案-1,删去一个划艇都没有的方案即可。

 

 

正解

n很小,可以将n个区间的端点离散化,

得到最多2*n个端点。

改变dp的状态定义,

设dp(i,j)表示到第i个学校,最多派出划艇数量在离散化后(j-1,j)区间内的方案数。

不在同一区间内的方案,可以参照子任务1/2,直接进行转移,

对于在同一区间内的方案,则用到了组合数。

 

将问题抽象化,则为在连续k个空格上,每个空格选择(1,len)之中的一个数放入,或者不选择任何一个数,要求严格递增,求总方案数。

不妨先考虑一个简单的问题:

不能不选择数,求总方案数。

显然答案是C(len,k),因为对于每种组合,和问题的答案是一一对应的。

推广到可以不选数的情况,

我们可以在k个空格外,增加k个0,第i个0表示第i个空格不选数,

我们发现,C(len+k,k)恰好与我们所求的问题一一对应,于是我们用构造的方法得到了问题的解,

使用前缀和等优化一下转移即可。

posted @ 2019-07-15 21:42  skyh  阅读(213)  评论(0编辑  收藏  举报