zoukankan      html  css  js  c++  java
  • 赛艇 题解

    一颗赛艇

    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)恰好与我们所求的问题一一对应,于是我们用构造的方法得到了问题的解,

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

  • 相关阅读:
    拷贝本地文件到docker容器
    python3 使用pip安装(命令行中)失败或 “not a supported wheel” 解决方案!
    Scrapy框架爬虫
    2019227单词记录
    开班第一碗
    函数进阶
    Oracle数组
    oracle merge into使用
    oracle授权替代database link 速度加快
    ora01031:权限不足
  • 原文地址:https://www.cnblogs.com/skyh/p/11191730.html
Copyright © 2011-2022 走看看