Everlasting Pages

返回

2026 WUST选拔赛Round1 L题题解#

原题链接:Nowcoder

题意:#

11nn 上有 nn 个位置,每个位置放置了一个弹簧,弹簧能将弹球弹到固定的点 a[i]a[i] (1a[i]n)(1 \leq a[i] \leq n) 上。

接下来要进行 mm 个操作:在第 ii (1im)(1 \leq i \leq m) 个操作中,你需要放置一个拥有无限动力的弹球在 b[i]c[i1]b[i] \oplus c[i - 1] 处,并回答在 b[i]c[i1]b[i] \oplus c[i - 1] 处的弹球个数 c[i]c[i]

注意:操作的顺序为:先放入一个弹球,询问当前位置的弹球数量,再所有弹球沿边移动一步。

已知 c[0]=0c[0] = 0 。给定位置个数 nn (1n5e5)(1 \leq n \leq 5e5) ,操作数 mm (1m5e5)(1 \leq m \leq 5e5) 和数组 aabb。保证所有弹球都会被放置在 pospos (1posn)(1 \leq pos \leq n) 中。

思路:#

  1. 转化题意

    由于每个位置的弹球都会在一次操作中从位置 xx 被移到 a[x]a[x],因此可以将每一个位置看成一个点,并连接一条有向边,形成了由若干个基环树组成的函数图。因此,此题可以转化为: 在由若干个基环树组成的函数图上,支持动态加入弹球,并在线查询某个时刻某个点上的弹球数量。

  2. 非环点

    对于不在环上的点,弹球会不断沿边移动,直到第一次到达唯一的,且在其所在基环树的环上的点为止。对于任意一个基环树来说,每一个非环点都在以某个唯一的,且在其所在基环树的环上的点为根的树上。因此,我们可以建立反图,利用树的结构去维护位置。

    接下来需要维护非环点上弹球的位置。设在第 tt 次操作中在非环点 uu 放入弹球,在第 ii (tim)(t \leq i \leq m) 次操作中询问非环点 vv ,且这个弹球在点 vv 上。利用树的结构,我们可以知道弹球从 uu 移动到点 vv 所需要的时间为点 uu 在树上的深度减去 vv 的在树上的深度,设 dep[x]dep[x] 表示点 xx 的深度,即有:it=dep[u]dep[v]i - t = dep[u] - dep[v],变形可以得到: i+dep[v]=t+dep[u]i + dep[v] = t + dep[u]

    另外,点 uu 一定位于以点 vv 为根的子树中。因此,不仅要满足 i+dep[v]=t+dep[u]i + dep[v] = t + dep[u] 的时间条件,也要满足路径条件。可以对每一个树都维护一个 dfsdfs 序,设点 tin[x]tin[x]tout[x]tout[x] 分别为点 xxdfsdfs 进入时间和点 xx 子树内最大的 dfsdfs 进入时间,则需满足:tin[v]tin[u]tout[v]tin[v] \leq tin[u] \leq tout[v]

    因此,查询非环点 vv 时,只需统计满足i+dep[v]=t+dep[u]i + dep[v] = t + dep[u]tin[u]tin[u][tin[v],tout[v]][tin[v], tout[v]] 之间的历史插入点 uu 。因此,可以按照 keykey (key=t+dep[u])(key = t + dep[u]) 的值进行分类,对于每一个 keykey 来说,使用对应的平衡树维护其插入点的dfsdfs序,并统计 [tin[v],tout[v]][tin[v], tout[v]] 之间的数目即可。我们可以使用unordered_map<int, ordered_set<array <int, 2> >进行维护。其中 key=t+dep[u]key = t + dep[u]ordered_set中存储 {tin[u], t} ,防止同一个点多次插入后仍计算为同一个点。

  3. 环点

    对于环上的点,弹球会不断沿环上的边移动。设在第 tt 次操作中在环点 uu 放入弹球,环点 uu 所在的环的长度为 lenlen ,环点编号为 posipos_i 。则在第 TT (tTm)(t \leq T \leq m) 次操作中,弹球会移动到编号为 pos[v]pos[v] (pos[v]pos[u]+(Tt)(modlen))(pos[v] \equiv pos[u] + (T - t) \pmod {len}) 上,变形有: pos[u]tpos[v]T(modlen)pos[u] - t \equiv pos[v] - T \pmod {len}

    因此,与非环点类似, pos[u]tpos[u] - t 仍然是一个不变量 c_idc\_id ,利用简单数组统计有相同 c_idc\_id 的点的数量即可。

    除此之外,环点还需要维护弹球从非环点走到环上的弹球数量。对于每一个在非环点的弹球,可以利用其树的深度来快速算出其进入环点的时间,可以在对应的时间把这些点当作环点加入环内即可。

代码:#

2026_WUST选拔赛Round1_L题题解
https://blog.everlasting.xin/blog/2026_wust%E9%80%89%E6%8B%94%E8%B5%9Bround1_l%E9%A2%98%E9%A2%98%E8%A7%A3/
Author Everlasting
Published at 2026年6月15日
Comment seems to stuck. Try to refresh?✨