zoukankan      html  css  js  c++  java
  • Atcoder ARC-068

    A

    不难发现从 (5) 开始一直往 (6) 转再转回来是最优的,直接模拟即可。

    B

    不难发现可以将多余部分直接贪心消去,最后必然会剩下两个或 (1) 个多余的数。

    如果剩下两个,此时多余的数必然是偶数个,取之前序列中和这两个数中一个相等的数即可将这两个数消去,不浪费一个数。

    否则,此时多余的数必然是奇数个,一定需要找到和这一个数相等的数和另一个数,需要浪费一个数。

    C

    首先的一个想法是对于一个商品 ([l, r])(l ightarrow r) 之间的每个数加 (1),然后对于每辆车直接调和级数查询。

    不难发现这样会记重,因为可能一辆车能跳到的位置可能会被一间商品覆盖多次。

    那么一个很直接的想法就是思考怎么才能不计重。

    那么对于一件商品 ([l, r]) 和第 (d) 辆车,当且仅当存在若干个 (d) 的倍数在 ([l, r]) 之间时才会被记重。

    一个很直接的想法就是只让这若干个倍数只有一个被记录,为了方便,我们考虑只记录第一个包含在 ([l, r])(d) 的倍数。

    假设第一个在区间内 (d) 的倍数为 (kd),那么不难发现这个区间的左端点必然处于 (((k - 1)d, kd]) 之间,右端点必然在 ([kd, m]) 之间。

    于是问题就转化为,对于 (d) 的每个倍数 (kd),求出左端点在 (((k - 1)d, kd]) 之间,右端点在 ([kd, m]) 之间的区间个数。

    我们限制一方的端点,不难发现问题进一步转化为限制右端点在 ([kd, m]) 的区间中,左端点在 (((k - 1)d, kd]) 之间的区间个数。

    不难发现将区间挂在右端点上,直接主席树即可,复杂度 (O(n log ^ 2 n))

    然而有没有更为简单的方法呢,答案是有的。

    需要发现这样一条性质,对于一个区间 ([l, r])(len = r - l + 1),那么对于 (d ge len) 的车辆,一定可以获得该区间的商品。

    这意味着对于每辆车 (d)(r - l + 1 ge d) 的区间我们是不需要处理去重的问题的,只需要在答案上加上这部分商品的数量即可。

    那么对于 (r - l + 1 < d) 的区间呢?

    不难发现这样的区间最多只会包含一个 (d) 的倍数,因此这部分也是不需要去重的,直接统计即可。

    实现时将区间按照长短排序,双指针扫过来,使用树状数组动态加入线段,复杂度 (O(n log ^ 2 n))

    D

    近期的一些 (dp) 中已经详细记录了本题 (O(n ^ 2))(dp) 解法,下面是一个基于 (dp)(O(n)) 优化。

    观察一下 (dp) 方程:

    [dp_{i, j} = sumlimits_{k ge j} dp_{i - 1, k}(j e 1, j le n - i + 1) ]

    [dp_{i, j} = sumlimits_{k > j} dp_{i - 1, k}(j = 1, j le n - i + 1) ]

    事实上这个 (dp) 的转移方程是具有组合意义的,首先不看方程后面的限制,不难发现这是从 (n + 1) 走到 (1) 恰好走 (k) 步的方案数。

    为了方便起见,我们将这个过程倒过来看,看作是从 (0) 开始走 (k) 步走到 (n) 的方案。

    那么那两个多余的限制就等价于最后一步走的步数必须不为 (0) 且对于每一个走了 (i) 步的位置,满足之前一共走的步数不能低于 (i) 步。

    单看后面这个限制是一个经典的组合数问题,将问题具体化放到坐标系下看待。

    那么问题就等价于从 ((0, 0)) 开始走到 ((k, n))(k) 步,每一步横坐标必须 (+1) 纵坐标无限制,且这整条路线必须在 (y = x) 之上的方案。

    如果没有在 (y = x) 之上这条限制,答案就相当于解一个非负整数不定方程的解,运用插板法即为 (dbinom{n + k - 1}{n})

    下面来考虑存在一段路线在 (y = x) 之下的非法情况。

    (y = x) 下移一个单位长度,变成 (y = x - 1)

    ((0, 0)) 关于 (y = x - 1) 的对称点 ((1, -1)),不难发现每一个非法的走法都必然会经过 (y = x - 1),令第一次经过的点为 (A)

    将从 ((0, 0)) 开始一直到 (A) 的这条路线翻折,都会唯一对应一条从 ((1, -1)) 开始沿着这条翻折路线再沿着前者在 (A) 之后走的路线。

    由此不难证明从 ((0, 0)) 走到 ((k, n)) 的非法路径,和从 ((1, -1)) 走到 ((k, n)) 的所有路径组成的集合是相等的。

    因此所有的非法方案就等于从 ((1, -1)) 走到 ((k, n)) 的任意一个方案,方案数即为 (dbinom{n + k - 1}{n + 1})

    因此只考虑后面一个限制的答案即为:

    [F_{k, n} = dbinom{n + k - 1}{n} - dbinom{n + k - 1}{n + 1} ]

    再来考虑前一条限制的情况。

    可以发现,如果前面一条限制是不满足的,那么这条路线必然会经过 ((k - 1, n)) 这个点,于是我们直接容斥即可得到答案:

    [Ans = F_{k, n} - F_{k - 1, n} ]

    复杂度 (O(n)),瓶颈在于计算组合数上。

    GO!
  • 相关阅读:
    IOC(控制反转)
    JQuery中的DOM操作
    【JQuery的选择器】
    JPA基本注解介绍
    JPA使用的HelloWorld
    JPA的介绍
    JQuery简介及HelloWorld
    SpringMvc处理post请求乱码的filter
    Sping3.0版本+Quartz完成定时任务
    CentOS下安装Subversion (SVN)
  • 原文地址:https://www.cnblogs.com/Go7338395/p/13819159.html
Copyright © 2011-2022 走看看