一颗赛艇
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)恰好与我们所求的问题一一对应,于是我们用构造的方法得到了问题的解,
使用前缀和等优化一下转移即可。