专栏文章

题解:CF1060G Balls and Pockets

CF1060G题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min06y3l
此快照首次捕获于
2025/12/01 18:25
3 个月前
此快照最后确认于
2025/12/01 18:25
3 个月前
查看原文
尝试考察一个极远的数值区间 [L,L+n1][L,L+n-1](不妨令 L=1018L=10^{18}),用线段树维护这 nn数值当前所在的位置,记作 gg。我们每次操作一遍会有什么影响?
如果 gL>ang_L>a_n,此时操作一次会令 gg 中每个元素的值减去 nn(相当于 [L,L+n1][L,L+n-1] 中每个数的对应位置向前移动 nn 步)。
而如果 gLangL+n1g_L\le a_n\le g_{L+n-1},且 gL>an1g_L>a_{n-1}。此时操作一次会使得 ana_n 这个位置上的数被删掉。二分出 ana_n 这个位置对应的数值 xx,那么在线段树 gg 上,<x<x 的数的位置会减去 n1n-1,而 >x>x 的数的位置会减去 nn。为了方便,我们不妨令 xx 本身的位置也减去 n1n-1,这样的话 xx 就和 x+1x+1 重叠了,它们位置相同了。我们只需要在线段树二分的时候取出最后一个满足条件的数,就可以实现类似于删除 xx 的效果。
上面的过程在干什么?我们先定义「向前移动」操作表示将 gg 中每个数减去 nn。而当 gL>ang_L>a_n 时,在下一次「向前移动」前,我们需要先把被 aa 覆盖的位置扣掉。我们就二分出 gx=ang_x=a_n,将 [x+1,L+n1][x+1,L+n-1]gg11,然后将 nn1n\gets n-1。后面再进行「向前移动」操作的时候结果也是正确的(原谅我的语言表达能力,这里或许有一些难懂,但这里其实爱怎么处理怎么处理,先继续下去吧)。
我们发现如果 gLg_L 同一时间覆盖了多个 aa 也是相同的。假如恰好覆盖了 an1a_{n-1}ana_n(设二分出的结果是 x,yx,y),此时 [y+1,L+n1][y+1,L+n-1]gg 减去 nn[x+1,y][x+1,y] 减去 n1n-1[L,x][L,x] 减去 n2n-2
上面的过程在干什么?我们在下一次「向前移动」之前,如果发现 gLg_L 覆盖了 ana_n,就二分出 gx=ang_x=a_n,将 [x+1,L+n1][x+1,L+n-1]gg 减去 11,然后将 nn1n\gets n-1,然后继续判断 gLg_L 是否覆盖新的 ana_n,如果是则重复上述过程。
这里类似于一个双指针。此时我们不禁想,这个双指针到底是否正确,是否会出现某个 ana_n,处理完 ana_n 的情况后,新的 [gL,gL+n1][g_L,g_{L+n-1}] 还是包含 ana_n
实际上并不存在,这是因为:
  • 数值 [L,L+n1][L,L+n-1] 不断向前移动,它们所有时刻的所有位置构成的集合不重,且是 [a1,L+n1][a_1,L+n-1]
这是因为在 [L,L+n1][L,L+n-1] 的位置不包含 ana_n 时,显然是不断向前移动 nn 步的,不会重复。而当它们遇到一个 ana_n 后,二分出 xx,是 [L,x1][L,x-1] 的位置向前移动 nn 步,[x+1,L+n1][x+1,L+n-1] 的位置向前移动 nn 步,删掉 ana_n 对应的数(不要忘了上面只是将 ana_n 对应的数和 an+1a_{n+1} 对应的数重叠在一起方便处理,实际上它是要被删掉的)。
x+1x+1 的位置是 x1x-1 的位置加 22,而 x1x-1 的位置减 nnx+1x+1 的位置减 n1n-1,它们这么操作后变成了一个长度为 n1n-1 的连续段,之后每次都会减去 n1n-1, 变成了子问题。归纳证明出它们构成的位置结合不重不漏覆盖 [a1,L+n1][a_1,L+n-1]
于是我们可以双指针求出每个位置 xix_i 在经过 tit_i 轮之后的数是 wiw_i。但这里 tit_i 不是我们能够控制的,且一定不等于 did_i,不过拜 LL 是极大值所赐,ti>dit_i>d_i
f(x)f(x) 表示经过一轮操作后 xx 这个位置上的值是什么,相当于我们已经得知 ft(x)=wf^t(x)=w 了。
不妨考虑复合上 fdtf^{d-t} 这个函数,而因为 t>dt>d,也可以看作复合上 (f1)td(f^{-1})^{t-d} 这个函数。f1f^{-1} 是什么意思:经过一轮操作后值 xx 在哪个位置。
所以我们还需要计算 (f1)v(w)(f^{-1})^v(w),此处 ww 一定是 [L,L+n1][L,L+n-1] 中的数(因为 ww 就是这么得来的)。
我们重复上述模拟,维护数值 [L,L+n1][L,L+n-1] 所在的位置,然后达到 vv 轮后就处理一下 ww 所在位置,因为 td<tt-d<t,而在 tt 时刻 ww 还能作为上一次能够求出的东西,说明 tt 时刻 ww 还没有被删掉,而 tdt-d 时刻 ww 肯定还没被删掉。所以一定可以求出 ww 所在的位置。
求出来的就是答案。注意请特判一下 x<a1x<a_1 的情况,因为 [L,L+n1][L,L+n-1] 覆盖的值只能到 a1a_1 之后,前面是覆盖不到的,所以不能求出一个有效的 ttww

评论

0 条评论,欢迎与作者交流。

正在加载评论...