A: 容易发现数组内第一个和最后一个元素都不可能是 thisislike 序列的权值,同时,在子序列第一个元素为数组第一个元素,且子序列最后一个元素为数组最后一个元素的情况下,thisislike 序列的权值可以是数组内下标从 到 的任意一个元素,因此输出下标从 到 内的元素的最小值。
B: 发现 ,讨论 的奇偶性:
当 为偶数时,可以把 与 配对,得到 , 与 互质不影响。
否则,可以把 与 配对,得到 。
题目放过了不用 gcd 的暴力循环写法。
C: 对数组 进行单调栈,获取子数组内最小值为 时的最小起始下标 和最大结束下标 ,特别地,我们认为当两个元素相等时,下标更小的那个元素小。
容易发现对于 这个区间内的任意长度 ,总有一个长度为 的最小值为 的子数组,且不存在长度大于 的最小值为 的子数组。
把查询离线后找到当前符合条件的最大 ,判定它是否大于等于当前查询的 即可。
D: 同样进行单调栈并离线,考虑当加入符合条件的 时,枚举左端点 ,发现对长度的贡献是一个区间 ,可以转换成两次对差分数组的单点更新,同时发现对于多个 ,它们在差分数组上单点更新的位置也是连续的,使用线段树维护即可。区间加,查询前缀和之和
E: 发现 随着操作单调非递减,操作当前 不是最小值的 没有意义,考虑二分最后一次操作到的 ,设当前二分中点为 ,则问题转化为限制每次操作取的 不超过 ,可以操作的最大次数。
发现 ,同时 ,又有每次操作对 的增加值只与 有关,这启示我们维护一个长度为 的倍增数组 , 表示从模 意义下等于 的数 操作 次得到的增加值, 表示操作的次数, 表示操作第 次的增加值 乘以 之和(也就是对差分做了一次前缀和),然后对于每个 ,在倍增数组上二分即可(倍增数组维护的是先对 进行变换再把 添加到总费用,因此需要一些转换)。
特别地,因为题目要求先增加总费用再变换 ,但倍增数组是先变换 再增加总费用,我们可以先特判 ,如果 < ,则不可操作 ,返回 ,否则,把可以操作的次数加一,然后就转换到了先增加总费用再变换 。
智慧数据:
in:
2 53119 98570 100000
999999998 2
57601 70916
out:
88599045
F: 考虑只有一种颜色的情况,把位置 建一个入点 和一个出点 , 向 连容量为 的边,表示至多可以从这个点向前跳 次,同时 向 连一条容量为无限的边,表示从位置 至多可以跳到位置 ,然后从 向 连一条容量为无限的边,这样就可以处理位置 跳到小于 的位置 的情况 (容易证明 跳到小于等于 的 是无意义的,这样加边仍然满足题目条件)。
接下来从源点 到位置 的 连一条容量为无限的边,表示从位置 开始,可以有无限人跳到位置 ,此时这张图的从源点 到汇点 的网络最大流即为答案,考虑最小割最大流定理。
首先,当 被分配到 集合但是 被分配到 集合时,割的总容量加无限,显然并不是最小割,因此 只能由一个分配到 集合的前缀与一个分配到 集合的后缀组成,且当 时, 只能被分配到 集合。 这个前后缀的性质启发我们枚举 内 集合的前缀与 集合的后缀的分割点,那么对于位置 ,当 被分配到 集合且 被分配到 集合时,割的总容量加无限,为了避免这种情况,我们只能把 分配到 集合,同时总容量加 ,否则,我们就可以把 与 分配到同一个集合,这样对割的总容量没有变化。
进一步地,定义 为 内前 个点被分配到 集合,其他都在 集合的最小割,容易发现对于位置 来说,其实就相当于将 内下标在 内的元素加 ,使用线段树动态维护 数组内的最小值即可。
有多种颜色的情况实际上可以使用二分查找转换到只有一种颜色的情况的答案之和。