专栏文章
题解:CF1060G Balls and Pockets
CF1060G题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min06y3l
- 此快照首次捕获于
- 2025/12/01 18:25 3 个月前
- 此快照最后确认于
- 2025/12/01 18:25 3 个月前
尝试考察一个极远的数值区间 (不妨令 ),用线段树维护这 个数值当前所在的位置,记作 。我们每次操作一遍会有什么影响?
如果 ,此时操作一次会令 中每个元素的值减去 (相当于 中每个数的对应位置向前移动 步)。
而如果 ,且 。此时操作一次会使得 这个位置上的数被删掉。二分出 这个位置对应的数值 ,那么在线段树 上, 的数的位置会减去 ,而 的数的位置会减去 。为了方便,我们不妨令 本身的位置也减去 ,这样的话 就和 重叠了,它们位置相同了。我们只需要在线段树二分的时候取出最后一个满足条件的数,就可以实现类似于删除 的效果。
上面的过程在干什么?我们先定义「向前移动」操作表示将 中每个数减去 。而当 时,在下一次「向前移动」前,我们需要先把被 覆盖的位置扣掉。我们就二分出 ,将 的 减 ,然后将 。后面再进行「向前移动」操作的时候结果也是正确的(原谅我的语言表达能力,这里或许有一些难懂,但这里其实爱怎么处理怎么处理,先继续下去吧)。
我们发现如果 同一时间覆盖了多个 也是相同的。假如恰好覆盖了 和 (设二分出的结果是 ),此时 的 减去 , 减去 , 减去 。
上面的过程在干什么?我们在下一次「向前移动」之前,如果发现 覆盖了 ,就二分出 ,将 的 减去 ,然后将 ,然后继续判断 是否覆盖新的 ,如果是则重复上述过程。
这里类似于一个双指针。此时我们不禁想,这个双指针到底是否正确,是否会出现某个 ,处理完 的情况后,新的 还是包含 ?
实际上并不存在,这是因为:
- 数值 不断向前移动,它们所有时刻的所有位置构成的集合不重,且是 。
这是因为在 的位置不包含 时,显然是不断向前移动 步的,不会重复。而当它们遇到一个 后,二分出 ,是 的位置向前移动 步, 的位置向前移动 步,删掉 对应的数(不要忘了上面只是将 对应的数和 对应的数重叠在一起方便处理,实际上它是要被删掉的)。
的位置是 的位置加 ,而 的位置减 , 的位置减 ,它们这么操作后变成了一个长度为 的连续段,之后每次都会减去 , 变成了子问题。归纳证明出它们构成的位置结合不重不漏覆盖 。
于是我们可以双指针求出每个位置 在经过 轮之后的数是 。但这里 不是我们能够控制的,且一定不等于 ,不过拜 是极大值所赐,。
设 表示经过一轮操作后 这个位置上的值是什么,相当于我们已经得知 了。
不妨考虑复合上 这个函数,而因为 ,也可以看作复合上 这个函数。 是什么意思:经过一轮操作后值 在哪个位置。
所以我们还需要计算 ,此处 一定是 中的数(因为 就是这么得来的)。
我们重复上述模拟,维护数值 所在的位置,然后达到 轮后就处理一下 所在位置,因为 ,而在 时刻 还能作为上一次能够求出的东西,说明 时刻 还没有被删掉,而 时刻 肯定还没被删掉。所以一定可以求出 所在的位置。
求出来的就是答案。注意请特判一下 的情况,因为 覆盖的值只能到 之后,前面是覆盖不到的,所以不能求出一个有效的 和 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...