首页 > 其他分享 >扫描线

扫描线

时间:2024-02-05 16:00:17浏览次数:23  
标签:le10 .. 离线 询问 个数 扫描线

扫描线的精髓是通过离线、引入时间维,把静态询问降低一维、变成动态问题。

一般是先把若干询问通过可减性变成前缀询问,再离线、从左到右排序,从左到右一个一个地一边加入元素,一边回答询问。

以下是例题 + 一句话题解。(虽然可能不是真的一句话)

平面最值

二维平面上 \(n(\le10^5)\) 个点,每个点有权值 \((\le10^9)\),\(m(\le10^5)\) 次询问 \((a,b,c)\),求满足 \(x_i\le a\) 且 \(y_i\in[b..c]\) 的最大点权。

离线、排序、离散化,需要支持加入点、求区间 \(\max\)。

二维数点

\(n(\le10^5)\) 个数的正整数序列,\(m(\le10^5)\) 次询问下标范围 \([l..r]\) 内元素值属于 \([x..y]\) 的个数。

经典题,把询问拆成两个前缀、离线,需要支持加入点、前缀求和。

HH 的项链

\(n(\le10^6)\) 个数的正整数序列 \(a_i(\le10^6)\),\(m(\le10^6)\) 次询问区间 \([l..r]\) 内不同的数的个数。

记录每个数上一个与它权值相同的数的位置 \(las_i\),问题转化为求 \([l,r]\) 内有多少 \(las_i<l\);拆分、离线、排序,需要支持加入一个数、前缀求和。

连通块计数

\(n(\le10^6)\) 个点的树,点编号 \(1\sim n\)、边编号 \(1\sim n-1\),\(m(\le10^6)\) 次询问 \(l,r\),若只考虑编号在 \(l..r\) 中的点和边,共多少个连通块?

每加一条边,连通块数就 \(-1\),故考虑有多少条边 \((u,v,id)\) 有效,即 \(u,v,id\) 均属于 \([l..r]\);再取个 \(\max\)、\(\min\),变成要求两个参数属于 \([l..r]\),扫一遍即可。

矩形周长、面积并

二维平面上 \(n(\le10^5)\) 个边平行于坐标轴的矩形,求覆盖的总面积、总周长,坐标绝对值 \(\le10^9\)。

离散化坐标,直接扫描线,区间加、全局查一共多少位置 \(>0\),所以线段树每个节点多记一个数表示区间总变化量 \(c\)(标记永久化),若 \(c>0\) 节点值为区间长;若 \(c=0\) 节点值为儿子值之和。仔细理解发现一定是对的。

注意一个很坑的地方:若两个矩形的边部分重合,要考虑重合部分周长是否算进去。

标签:le10,..,离线,询问,个数,扫描线
From: https://www.cnblogs.com/laijinyi/p/18008327/scanning

相关文章

  • 线段树维护扫描线
    你需要实现一种数据结构支持以下操作:区间加减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......
  • Auguryの扫描线分享
    Auguryの扫描线分享扫描线是啥有时候答案是不好计算的,但是答案可以拆分成多个段分别计算,且段与段之间可以快速转换,我们就可以用扫描线解决。或者说,一个二维问题,我们可以用扫描线变成一维。前置芝士线段树、值域线段树、树状数组(胡扬好闪,拜谢胡扬)离散化现在我们有一堆数,你......
  • 写个扫描线吧
    虽然扫描线很简单,但是我发现理解还是有些不清晰,于是决定写一篇。原问题,或者说是例题一个不好暴力东西,暴力模拟不带优化至少O(n^3)也是一个非常经典的线段树例题(因为懒得画图所以下面就直接用网上dalao的题解里面的图片了)首先,因为我们要在线段树上面记录下来每一个起始点和结束点,所......
  • 扫描线
    #include<bits/stdc++.h>#definemaxn200005#defineintlonglongusingnamespacestd;intx[maxn];//x[i]表示从左往右第i条竖边inttsum[maxn<<3],tlen[maxn<<3];//tsum表示当前节点被覆盖的次数//tlen是当前节点所对应的长方形的长voidpushup(intk,intl,intr)/......
  • 扫描线补充
    1.两条扫描线之间,不一定是一个矩形,可能是多个不相交的,高相同的矩形2.扫描线的板子没有pushdownvoidupd(intu,intl,intr){ if(cnt[u]){ len[u]=b[r+1]-b[l]; sum[u]=2; lh[u]=rh[u]=1; }else{ len[u]=len[lch]+len[rch]; sum[u]=sum[lch]+sum[rch]; lh[u]=lh[......
  • P5490 【模板】扫描线
    \(P5490\)【模板】扫描线一、题目描述求\(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)\)。输出格式......