莫队与分块

发布时间 2023-03-26 11:21:13作者: SunnyYuan

分块基本思想:

  1. 将长度为 \(n\) 的序列划分成 \(\sqrt n\) 块,每块的元素个数为 \(\sqrt n\)
  2. 维护 \(pos[i]\) 表示下标 \(i\) 的元素所在块的编号,维护 \(L[i]\)\(R[i]\) 表示第 \(i\) 块的起始下标和中止下标。
  3. 每个块维护相应的信息,比如区间和等。
  4. 对于一次询问 \([x, y]\)
    4. 1. 若 \(x\)\(y\) 在同一个块中,则暴力枚举找答案,时间复杂度 \(O(\sqrt n)\)
    4. 2. 若 \(x\)\(y\) 不在同一个块,分为 \(3\) 部分处理:
    4. 2. 1. \(x\) 所在块,暴力枚举, \(O(\sqrt n)\)
    4. 2. 2. \(y\) 所在块,暴力枚举,\(O(\sqrt n)\)
    4. 2. 3. \(x\)\(y\) 中间完整的块,整块枚举, \(O(\sqrt n)\)
    同时注意加上 \(tag[i]\)
  5. 对于一次修改 \([x, y]\),增加 \(val\),与询问类似。
    5. 1. 维护块的标记 \(tag[i]\),表示第 \(i\) 个块的修改信息,枚举完整的块时,修改 \(tag[i]\),否则不改动。
    5. 2. 询问时不论是完整的块还是不完整的块,都要读取 \(tag[i]\)