二维数点问题及其变形

其实最早开始用主席树二位数点是两年前了。一直没有坐下来归纳一下二位数点的各种变形以及最优秀的实现方法。

单点加 矩形查

离线做法:
最简单的方法应该是扫描线。即维护一个序列数据结构(一般是树状数组/线段树)。序列数据结构上每个位置代表的值就是这个位置扫描过的区域(一条水平线段,开头在第一列)的点数。把每个矩形查询询问拆成两部分,用后面的减去前面的面积。
比如我们需要统计蓝色区域面积:

我们就使用粉色区域面积

减去红色区域面积即可

而我们这里的面积实际上就是每一行做前缀和之后一个区间的和。用树状数组/线段树很好维护。
半在线做法(在线询问 离线插入):
一般用主席树。对于一个离散化之后的点(x,y)(x,y)。我们令它第xx个插入,插入的值为yy。然后直接询问矩形即可。

矩形加 单点查

只需要把矩形加转化为4次单点加(近似长方形四个顶点,但是有一些偏移):
左上角的点是长方形的顶点,右上角是长方形顶点向右移动一格,左下角是顶点向下移动一格,右下角是顶点向右下分别移动一格。

然后如果我们需要查询红色点,只要询问红色点的前缀矩形(即蓝色矩形)即可。

这就转化成了单点加 矩形查的问题。