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]\) 内。

posted @ 2025-11-23 19:42  dengchengyu  阅读(4)  评论(0)    收藏  举报