二维数点总结
有很多数数题都可以转化为二维数点模型。将一些二元信息视作平面上的若干个点,查询即数一个矩形中有多少个点/点的权值之和等信息。
那么这很明显是DS题(或者至少要上DS优化一下)。我们来想想怎么处理矩阵查询。
离线
离线的时候做法很多。
但基本都有一个共性:把询问差分,转化为前缀信息(在平面上反映出来的是以原点为一个顶点的矩形的信息)。
BIT/线段树
我们把询问差分之后,再按\(x\)排序,然后就可以运用扫描线的思想。
我们将询问同样视作一个点(即以原点为一个顶点的矩形的不在坐标轴上的那个顶点)。将维护的DS视作一条竖直的扫描线,从左至右扫(从右至左也可以,只是差分方式和一些细节改一下,具体选择看数点部分以外的东西怎样方便实现)。
将扫到的点都加入DS中,再来处理扫描线扫到的询问。我们发现扫描线使得一个平面上的前缀信息在扫描线上对应着序列的前缀,于是直接查询DS的前缀信息即可回答询问。
写的时候注意常数问题,并且数清楚复杂度有几只\(\log\)。
CDQ分治
不太会写,口胡一下。
同样差分询问,然后发现就是数\((x,y)\)左下方有多少个点。这是一个二维偏序,于是CDQ就好了。
在线
使用一些高级数据结构就可以在线了。
树套树
显然是可以数清楚有多少个点的,就是难写,而且似乎比离线BIT多一只\(\log\)。
KDT
这位更是重量级,但是我不会。
术业有专攻,KDT就是干这个的。