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) 的转移方程是具有组合意义的,首先不看方程后面的限制,不难发现这是从 (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})。
因此只考虑后面一个限制的答案即为:
再来考虑前一条限制的情况。
可以发现,如果前面一条限制是不满足的,那么这条路线必然会经过 ((k - 1, n)) 这个点,于是我们直接容斥即可得到答案:
复杂度 (O(n)),瓶颈在于计算组合数上。