二维数点总结

有很多数数题都可以转化为二维数点模型。将一些二元信息视作平面上的若干个点,查询即数一个矩形中有多少个点/点的权值之和等信息。

那么这很明显是DS题(或者至少要上DS优化一下)。我们来想想怎么处理矩阵查询。

基础:扫描线

矩形面积并

扫描线从左往右扫,线段树维护扫描线上的信息,令一个矩形左侧的边权值为+1,右侧的边权值为1,则每次扫到一条矩形的边的位置,然后区间修改。

线段树上一个位置的值不为0就代表这个地方被矩形覆盖过,于是直接统计不为零的位置个数,然后乘上扫描线的移动距离就得到了扫描线扫到的矩形面积。

矩形面积交,矩形周长并,矩形周长交是类似的。这三个是口胡的。

广义扫描线

在二维平面上同样做一条扫描线来扫。可以维护的东西不止面积并。

很好的作用是把二维信息搞到一维上去了。

离线

离线的时候做法很多。

但基本都有一个共性:把询问差分,转化为前缀信息(在平面上反映出来的是以原点为一个顶点的矩形的信息)。

BIT/线段树

我们把询问差分之后,再按x排序,然后就可以运用扫描线的思想。

我们将询问同样视作一个点(即以原点为一个顶点的矩形的不在坐标轴上的那个顶点)。将维护的DS视作一条竖直的扫描线,从左至右扫(从右至左也可以,只是差分方式和一些细节改一下,具体选择看数点部分以外的东西怎样方便实现)。

将扫到的点都加入DS中,再来处理扫描线扫到的询问。我们发现扫描线使得一个平面上的前缀信息在扫描线上对应着序列的前缀,于是直接查询DS的前缀信息即可回答询问。

写的时候注意常数问题,并且数清楚复杂度有几只log

CDQ分治

不太会写,口胡一下。

同样差分询问,然后发现就是数(x,y)左下方有多少个点。这是一个二维偏序,于是CDQ就好了。

在线

使用一些高级数据结构就可以在线了。

树套树

显然是可以数清楚有多少个点的,就是难写,而且似乎比离线BIT多一只log

KDT

这位更是重量级,但是我不会。

术业有专攻,KDT就是干这个的。

posted @   RandomShuffle  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示