首页 > 其他分享 >扫描线

扫描线

时间:2023-03-21 12:45:43浏览次数:26  
标签:差分 正交 修改 扫描线 查询 side

研究对象

在一个B维直角坐标系下,第i维坐标在一个整数范围[li,ri]间,内部的点集称为一个B维正交范围。
一般1维正交范围简称区间,2维正交范围简称矩形,3维正交范围简称立方体
对于B维正交范围,每一维都有两个限制,即有两条边(side),这样是一个2B-side的B维正交范围
如果部分维只有一个限制,则是一个A-side的B维正交范围
如果有一维没有限制,则这一维是平凡的,没有任何意义,可以简化到一个(B-1)维的问题
A-side的B维正交范围不能确定出是哪些维,如果维不对称的话需要特殊说明

模型

扫描线有两种模型:

  1. 对于一个静态的二维问题,我们可以使用扫描线扫一维,数据结构维护另一维
    在扫描线从左到右扫的过程中,会在数据结构维护的那一维上产生一些修改与查询
    如果查询的信息可差分的话直接使用差分,否则需要使用分治
  2. 另一种看待问题的角度是站在序列角度,而不站在二维平面角度
    如果我们这样看待问题,则扫描线实际上是枚举了右端点r=1…n,维护一个数据结构,支持查询对于当前的r,给定一个值l,l到r的答案是什么
    即扫描线扫询问右端点,数据结构维护所有左端点的答案

Notice:
其实看到任何范围修改查询问题,如果能差分的话,想都不想就差分是不会有问题的,我推荐直接这样做
典型的差分方法:
序列区间[l,r]差分为[1,r]-[1,l-1]的前缀
树上差分
二维前缀和的差分

处理二维正交范围的扫描线

问题可差分的时候,我们通过差分可以将一个4-side矩形查询问题变为两个3-side矩形查询问题的差
将第一维的1-side的区间(即前缀)扫描线扫掉,数据结构维护2-side的区间查询(这里两条边是相对的而不是相邻的),支持:
1.单点修改,区间查询
2.区间修改,单点查询
3.区间修改,区间查询
中的一种
(不要忘记了差分)

两大基础问题:

问题 1. 给一个长为n的序列,有m次查询,每次查区间[l,r]中值在[x,y]内的元素个数

我们考虑 \(x\) 轴表示序列,\(y\) 轴表示权值。

image

先差分,去掉序列维度的左端,然后对序列维度扫描线,维护竖着的数据结构,支持单点加点和区间查询和。

能使用树状数组尽量使用树状数组,这里可以差分(加法有逆)所以可以使用树状数组维护。

第二维度可以看作时间维度,那么这时候修改从左到右并且强制在线,是主席树最经典的应用。主席树利用较少位置被修改的性质,最小化了开点的个数。对于区间修改也是可以主席树的。
当然,本着能不线段树就不线段树的原则,依然是可以树状数组做。考虑树状数组进行一次修改也是只需要修改 \(\log n\) 个节点,可以做可持久化树状数组。

问题 2. 给一个二维平面,上面有n个矩形,每个矩形坐标[1,n]
有m次查询,每次查询一个二维平面上的点被多少矩形包含
image

对某一维从左到右扫描线并且维护每个点被多少个矩形包含。有区间修改,单点查询,把区间修改差分掉变两个前缀修改,单点查询差分掉变两个前缀查询,可以用树状数组维护。

标签:差分,正交,修改,扫描线,查询,side
From: https://www.cnblogs.com/Zeardoe/p/17238795.html

相关文章

  • 【扫描线】LeetCode 253. 会议室 II
    题目链接253.会议室II思路这道题非常类似于坐公交车上下车。样例中intervals=[[0,30],[5,10],[15,20]]可以这么拆解上车:[0,+1],[5,+1],[15,+1]下车:[10,-......
  • 扫描线(计算几何)
    semi-AFO选手的DS记录(您将在这里见到最垃圾的扫描线写法.1.面积扫描线本身还是很好理解的.偷一张图(图源OI-wiki)下面的\(cnt\)表示对应区域被矩形覆盖的次......
  • 扫描线
    顾名思义,扫描线就是二维平面内的一根不断扫描的线,能够帮助我们处理面积、周长等问题。以矩形的面积并为例:假设平面上有\(n\)个矩形,求他们的面积并。如下图:想象有一根......
  • 扫描线
    扫描线扫描线:假设有一条扫描线从一个图形的下方扫向上方(或者左方扫到右方),那么通过分析扫描线被图形截得的线段就能获得所要的结果。该过程可以用线段树进行加速。求面积......
  • 双指针与扫描线
    概述先空着。例题UVA1608不无聊的序列Non-boringsequences题意:判断\(S\)是否boring。所谓boring,就是存在\(S\)的子串\(s\)满足\(s\)中不存在只出现一......
  • [算法][解析几何]覆盖最多点固定半径圆问题 POJ1981 圆的扫描线 详细解法
    引题: 覆盖最多点固定半径圆问题改编自POJ1981CircleandPoint 背景:在二维平面中给定n个点,求半径为r的圆最多可以覆盖多少个点(1<=n<=300,精度eps=0.0001)输入......
  • 扫描线
    扫描线摆烂了\(3++\)月后,开始学习(复习)的第一个知识点,顺便复习下\(markdown\)再顺便转到博客园,不定时把博客\(luogu->cnblogs\)原题P5490【模板】扫描线【模板】扫......
  • 【学习笔记】扫描线
    备战NOIP2022填坑ing...扫描线思想就是把横边从小到大sort,拿条线从下往上扫,扫到横边算一下长度,再乘上两条横边的高度差,因为要求\(O(nlogn)\)的时间复杂度所以用线段......
  • 扫描线-线段树
    求面积并#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn;intX[N*2];structsegment{ intl,r,h,val;}seg[N*2]......
  • 【XSY3479】子区间(扫描线)
    题意:转化后变为:平面上给定\(n\)个关键点,\(q\)次询问一个点与其左上的每个关键点形成的矩形面积的最大值。题解:挺玄妙的一题。这里假设这\(n\)个关键点都是\(x\)......