【题解】CF2020D-思路

时间:2024-10-24 07:11:11

  求连通分量显然用并查集,根据 d < 10 d < 10 d<10这一特殊条件,每个点连边只需向后10个去连即可。于是题目的关键变成了如何维护每个点与后10个点是否有连边。
  每一次操作以等差数列的方式进行连边,考虑 d = 1 d=1 d=1的情况,我们可以使用差分数组来实现离线的区间维护。
  对于一般情况,我们可以多维护几个差分数组。令 m a r k [ i ] [ j ] [ t ] mark[i][j][t] mark[i][j][t]表示间隔为 i i i,总起点为 j < i j < i j<i的差分数组,再用相同结构的 s u m [ i ] [ j ] [ t ] sum[i][j][t] sum[i][j][t]将差分数组变回原数组即可。
  举个例子,对于第 x x x个数,在间隔为 d d d的情况下,对应的位置应该为 m a r k [ d ] [ i % d ] [ i / d ] mark[d][i \% d][i / d] mark[d][i%d][i/d]
  注意,由于余数的范围从0开始,所以为了方便我将所有输入的 a i a_{i} ai都减了1,即也从0开始。