分块维护不带修区间点对信息_杂项
JueFan 一只绝帆

分块维护不带修区间点对信息

通常求的是 i=lrj=lrf(i,j)\sum_{i=l}^r\sum_{j=l}^r f(i,j)

由于贡献可差分,我们可以利用分块按照一定套路求。

维护如下信息:

  • pxp_{x} 表示 [l(id(x)),x][l(id(x)),x] 的点对贡献。
  • sxs_x 表示 [x,r(id(x))][x,r(id(x))] 的点对贡献。
  • fL,Rf_{L,R} 表示 [l(L),r(R)][l(L),r(R)] 的点对贡献。
  • ci,jc_{i,j} 表示前 ii 块中对 jj 有贡献的元素个数(若求的不是点对个数那就是贡献和),如果贡献的两方不对等那么需要维护两个 cc

b(a,b,c,d)b(a,b,c,d) 表示暴力求 [a,b][a,b][c,d][c,d] 之间的贡献。

px,sxp_x,s_x 通常可以暴力,fL,R=fL+1,R+fL,R1fL+1,R1+b(l(L),l(R),r(L),r(R))f_{L,R}=f_{L+1,R}+f_{L,R-1}-f_{L+1,R-1}+b(l(L),l(R),r(L),r(R))

ci,jc_{i,j} 也需要找到好的方法,常用方法(如果 jj 这一维具有某种单调性)是先对块间做 ii 这一维的前缀和,再每块对 jj 这一维做前缀和。

实际询问中若 l,rl,r 在同一块,那么可以使用 prplb(l(id(l),l1,l,r)p_r-p_l-b(l(id(l),l-1,l,r) 来求。

l,rl,r 在不同块,那么中间块内部的贡献用 ff 来求,散块内部的贡献用 p,sp,s 来求,散块与中间块的贡献用 cc 来求,两散块的贡献用 bb 来求。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 231.7k 访客数 访问量