首页 > 其他分享 >扫描线

扫描线

时间:2024-03-24 15:46:44浏览次数:14  
标签:个数 len 即可 扫描线 维护 考虑

扫描线

是什么 & 矩形面积并

本质上可以理解为,对一个二维(或多维)平面上的问题,通过扫描一维,并且用数据结构动态维护另一位的增减性。

我们对于 \(x\) 轴扫描,那么会对面积构成影响的 \(y\) 显然只有红色的几条和绿色的几条。

容易发现,这样的线的数量是 \(2n\) 的(\(n\) 为矩形个数)。

所以可以理解为如下的问题:

有 \(2n\) 次操作,维护一个数组,有如下两种操作。

  • 对一个区间 \([l,r]\) 加上 \(\Delta\)。
  • 求 \(\sum [a_i>0]\)。

满足 \(n\le 10^5,\Delta \in \{1,-1\},l\le r\le 10^9\)。

这个问题看起来就很可以用数据结构维护,但是我们需要先把 \([l,r]\) 做离散化(实际上 \(a_i\) 极长连续段个数是 \(\mathcal O(n)\) 的),维护这些段的左右端点即可。

然后我们令一个节点的 \(len\) 表示这个节点的管辖范围内,\([a_i>0]\) 的个数。显然有 \(len_u=len_{lson_u}+len_{rson_u}\)。最后答案是 \(len_1\)。

所以我们只需要考虑前一个问题如何维护即可。再维护一个数 \(cover\),表示 \(u\) 所管辖的范围内,被完整覆盖了几次。

如果被完整覆盖了,那么 \(len_u\) 必然是 \(u\) 管辖的左右端点离散化以前的数。否则,\(len_u=len_{lson_u}+len_{rson_u}\) 即可。这样就形成了完整的 pushuppushdown ,构建好了线段树。

矩形周长并

首先,我们发现垂直于 \(x\) 轴和平行于 \(x\) 轴的边是类似的,所以我们分别处理即可。因此,下文只考虑平行于 \(x\) 轴的边。

还是像上文那样切成若干条线。一条线 \(ln\) 对于周长的贡献是 \(|(原周长 \cup ln)-原周长|\)​。所以我们像上文那样维护目前覆盖的长度即可,把两个方向的线段的答案加起来即可,和面积并的代码差别极小。

其他例题

[NOI2023] 方格染色

先考虑不同寻常的操作三。这玩意只会有 \(5\) 次,显然每次操作对 \(\mathcal O(n)\) 个格子有影响,然后 \(n,q\) 在前 \(95\) 分同阶,所以稍加转换就变成了典中典矩形面积并,时间复杂度 \(\mathcal O ((n+q)\log q)\),期望得分 \(95\) 分。

然后,我们考虑最后 \(5\) 分怎么做:

我们考虑一个斜率为 \(1\) 的一次函数,它与任何一条在这个平面直角坐标系内的直线都至多有一格相交。我们先把所有前两种操作带来的线处理后,再将斜线与每一条直线相交的位置用 map 记录下,考虑这样的交点有几个,用总覆盖面积减去这样的交点个数即可,代码不好写。时间复杂度 \(O(q\log q)\)。

P1908 逆序对

这玩意显然你用树状数组/归并排序啥的都可以做。

那么我们来考虑怎么转化成扫描线模型。

考虑将 \((a_i,i)\) 放在一个平面直角坐标系中,则对于每一个点,我们计算 \([(1,n),(a_i,i)]\) 内点的个数即可。

P1972 [SDOI2009] HH的项链

显然,这是一道莫队典题,可以在 \(O(n\sqrt m)\) 的时间复杂度内做完这道题,期望得到 \(60\) 分,显然你实现的精细一点的话也是可以过的。

不考虑莫队做法,将这道题转化到平面直角坐标系上,问题可以转化成 将 \((i,a[i])\) 放在一个平面直角坐标系中,对于 \([l,r]\) 的答案极为,在 \([(l_0,0),(r_0,A)]\)​ 中点的不同纵坐标有几个。这玩意你用树状数组稍微维护一下就可以了,甚至不需要线段树。

总结

总而言之,扫描线的思路就是数据结构维护一维,暴力模拟另一维。所有数组和下标都对答案有影响的题目,都可以把数组的每一项转化成 \((\text{值},\text{下标})\)。

标签:个数,len,即可,扫描线,维护,考虑
From: https://www.cnblogs.com/wtc-qwq/p/18092497

相关文章

  • 换维扫描线
    简介一般来说,我们处理某些可以离线的问题,我们会将询问离线,然后将修改挂在左端点或右端点,然后从左往右扫描这些修改,并处理询问,数据结构记录的一般是下标\(i\)到当前走到的地方的一些信息。而换维扫描线则采取了截然相反的措施:我们将区间修改转化成差分,然后从左往右扫描序列,线段......
  • 计算几何——扫描线 学习笔记
    计算几何——扫描线学习笔记你会发现我的笔记的顺序和很多扫描线的讲解是反着来的。其实是和我老师给的课件完全是逆序(谁帮我算一下逆序对啊喵)。前言一开始以为扫描线就是用来求二维几何图像的信息的。但是其实这个并不准确。个人认为,扫描线其实是一个思想,就像动态规划一样......
  • 扫描线学习笔记
    1.引入扫描线多用于图形上,是一条线在图形上扫来扫去,它一般被用来解决图形面积,周长,以及二维数点等问题。2.扫描线求面积并如下图:我们模拟一条扫描线,使它从下往上扫过整个平面,这条扫描线会在遇到横向线段的时候停下来更新一些东西。那么整个图形就可以找出四条线段,如图:更新的......
  • 【学习笔记】扫描线
    bilibili:BV1Mm411D7kr讲了一下。模板代码:面积并:#include<cstring>#include<iostream>#include<algorithm>#defineintlonglongusingnamespacestd;namespaceIO{template<typenameT>Tread(Tx){Tsum=0,opt=1......
  • 扫描线
    扫描线的精髓是通过离线、引入时间维,把静态询问降低一维、变成动态问题。一般是先把若干询问通过可减性变成前缀询问,再离线、从左到右排序,从左到右一个一个地一边加入元素,一边回答询问。以下是例题+一句话题解。(虽然可能不是真的一句话)平面最值二维平面上\(n(\le10^5)\)个......
  • 线段树维护扫描线
    你需要实现一种数据结构支持以下操作:区间加减1保证加减区间一一对应,且先加后减,序列中永远不出现负数。查询完整序列中0的个数#include<cstdio>#include<algorithm>constintmaxn=1e5+10;longlongx[maxn*2];structsegmentTree{ structnode { i......
  • 扫描线
    AcWing247.亚特兰蒂斯题意:给定若干个矩形(长宽均平行于坐标轴),求它们的面积并(矩形的顶点坐标可以是实数)。本题是扫描线算法的模板题。扫描线,顾名思义,就是按照一条线扫过去,对于本题扫描线-OIWiki(oi-wiki.org)如上图,这就是扫描线的过程。发现按照线扫描的话,每次我们只需......
  • 【模板】扫描线
    【模板】扫描线题目描述求$n$个四边平行于坐标轴的矩形的面积并。输入格式第一行一个正整数$n$。接下来$n$行每行四个非负整数$x_1,y_1,x_2,y_2$,表示一个矩形的四个端点坐标为$(x_1,y_1),(x_1,y_2),(x_2,y_2),(x_2,y_1)$。输出格式一行一个正整数,表示$n$个......
  • 浅谈扫描线
    Preface本文部分题目摘自lxl的数据结构系列课件由于工程量巨大,难免会出现错字、漏字的情况,如果影响到了您的阅读体验,还请私信我,我会在第一时间修复。本文建议大家有一定的数据结构基础后再来阅读/heart。个人感觉扫描线不是难点,难点在于怎么抽象模型。首先需要明白一个东......
  • 扫描线
    假设有一条扫描线从一个图形的下方扫向上方(或者左方扫到右方),那么通过分析扫描线被图形截得的线段就能获得所要的结果。该过程可以用线段树进行加速。P5490【模板】扫描线扫描线可以处理两类问题一类是面积并一类是周长并#include<iostream>#include<algorithm>usingnames......