2025.2.21 test

B

\(n\) 个点,每个点有一条出边,出边随周期改变,周期是 \(T_i\)\(2\) 的幂次,即在时刻 \(t\) 出边为 \(c_{i,t\bmod T_i}\)
\(q\) 次询问 \(t\) 时刻开始从 \(u\) 开始走 \(d\) 步的位置。\(n,q,\sum T_i\le 10^5,t,d\le 10^{18}\)

一般这种题自然想到倍增。如果我们设 \(f_{i,j,k}(j<T_i)\) 表示 \(j\) 时刻从 \(i\) 出发走 \(2^k\) 步到的位置。
但是这有个问题,如果 \(i\) 的值要用 \(u\) 更新的话必须要 \(T_i\ge T_u\),所以有很多值是没有的。
考虑给一条路径划分阶段,不妨用 $a_1\dots a_2\dots a_3\dots $ 表示,\(T_{a_i}\) 满足递增,$\dots $ 中的 \(T\) 都小于上一个 \(T_a\)
而阶段数是不超过 \(\log n\) 次的。我们用每个阶段的第一个位置的信息来解决这一个阶段。
不妨考虑求 \(f_{i,j,k}\) 表示从 \(i\)\(j\) 时刻出发走了 \(2^k\) 个跟 \(T_i\) 相同的点后走到哪,\(g_{i,j,k}\) 表示走了多远。
考虑一次询问,称同层为值相同的所有点,倍增出在同层走最远到哪,然后跳到下一层,重复该过程。
考虑求 \(f_{i,j,k}\),不妨先求出 \(f_{i,j,0}\)。按照 \(T_i\) 从小到大加入,求 \(f_{i,j,0}\) 的过程跟一次询问一样于是解决了。

posted @ 2025-02-21 21:01  s1monG  阅读(27)  评论(0)    收藏  举报