P12461 [Ynoi Easy Round 2018] 星野爱 题解
P12461 [Ynoi Easy Round 2018] 星野爱 题解
把每个点的所有出边拍到一个序列上,记作 \(\{to_i\}\),原来一个点的出边在序列上对应一段区间 \([L_i,R_i]\)。
操作就相当于:
- \(\forall i\in [L_l,R_r],w(to_i)\gets w(to_i)+val\)。
- 对 \(\forall i\in[L_l,R_r]\),求 \(w(to_i)\) 的和。
考虑带权分块,分成把 \(i\) 分成若干 \([L_i,R_i]\) 并集长度 \(\le B\) 的块,而对 \([L_i,R_i]\) 长度大于 \(B\) 的 \(i\) 单独分块。这样显然只有 \(O(\frac n B)\) 个块。
考虑修改对查询的贡献:
- 散块对询问中的散块,暴力维护 \(w(i)\),查询也暴力查询即可。
- 整块对询问区间,离线下来枚举每个整块,考虑其对所有询问的贡献。处理出 \(s_i\) 表示这个整块 \(+1\) 时对 \(\sum _{j\le i} w(to_j)\) 的影响,记 \(sum\) 为前缀时间 \(v\) 的和,则对一次查询的贡献就是 \((s_{R_r}-s_{L_l-1})\times sum\)。
- 散块对询问中的整块,和上面类似,依然枚举整块,统计修改时的 \(s\times v\) 的和。
复杂度 \(O(n\sqrt n)\),实际跑的时候 \(B\) 要取 \([2000,4000]\) 内。

浙公网安备 33010602011771号