扫描线

扫描线这个东西比较玄虚,总的来讲大概是一种思想。

想象一条线从区间(或是其他什么)慢慢扫过,线每次碰到某个东西称为事件,然后根据事件来进行一些操作。

一般来讲,区间用扫描线要用到离散化和线段树来优化(要不然)。

具体的扫描线怎么用,主要是根据题目来做。

现在来看看扫描线的题目:

POJ1151 Atlantis:

给出n个矩形,求面积并。

1.对于矩形(x1,y1)-(x2,y2),添加两个事件:(x1,y1,y2),(x2,y1,y2)

2.从左到右扫描所有事件

3.变成:加入一个区间,删除一个区间,求区间并的长度

4.离散化+线段树

时间: 2025-01-16 23:47:29

扫描线的相关文章

【BZOJ】1382: [Baltic2001]Mars Maps (线段树+扫描线)

1382: [Baltic2001]Mars Maps Time Limit: 5 Sec  Memory Limit: 64 MB Description 给出N个矩形,N<=10000.其坐标不超过10^9.求其面积并 Input 先给出一个数字N,代表有N个矩形. 接下来N行,每行四个数,代表矩形的坐标. Output 输出面积并 Sample Input 2 10 10 20 20 15 15 25 30 Sample Output 225 本以为是傻逼题,没想到不容易啊- 线段树+扫描

BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有任何两个球员的水平相同.将这些球员按水平排序, 对于一次比赛,你需要选择若干个球员去比赛,但不能同时选择两个水平相邻的球员. m次询问,每次给定a和k,表示要在年龄不超过a的球员中选择不超过k个球员, 请计算skill和的最大值. [题解] 对于询问年龄的限制,我们可以通过扫描线来处理. 我们将所有

【扫描线】Gym - 101190E - Expect to Wait

假设初始人数为0, 将每个时刻在等待的人数写下来,就是求个和. 如果纵坐标看成人数,横坐标看成时间,就是求个面积. 因为初始人数不一定为零,所以离线后扫描线即可回答所有询问. #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int n,m,e; struct LINE{ int y,l,id; }ls[200010]; bool cmp(const LINE &a

hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> #include <algorithm> #define MAXN 110 #define LL ((rt<<1)+1) #define RR ((rt<<1)+2) using namespace std; int n; struct segment{ double l

[CF612D] The Union of k-Segments(排序,扫描线)

题目链接:http://codeforces.com/contest/612/problem/D 题意:给n条线段,问覆盖了k次的区间有几个. 扫描线的思想,首先想到的是从左到右扫一遍,遇到出现被覆盖k次的端点,则开始计数,直到覆盖次数小于k为止. 其实可以用线段树做这道题,但是还有更巧妙的办法: 将左端点看作"入",右端点看作"出".每一个线段都是一个区间从入到出,入指的是覆盖次数+1,出指的是覆盖次数-1. 按照左端点升序排列,每遇到一个"入"

BZOJ 1845: [Cqoi2005] 三角形面积并 [计算几何 扫描线]

1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1151  Solved: 313[Submit][Status][Discuss] Description 给出n个三角形,求它们并的面积. Input 第一行为n(N < = 100), 即三角形的个数 以下n行,每行6个整数x1, y1, x2, y2, x3, y3,代表三角形的顶点坐标.坐标均为不超过10 ^ 6的实数,输入数据保留1位小数 Out

HUD 4007 [扫描线][序]

/* 大连热身B题 不要低头,不要放弃,不要气馁,不要慌张 题意: 坐标平面内给很多个点,放置一个边长为r的与坐标轴平行的正方形,问最多有多少个点在正方形内部. 思路: 按照x先排序,然后确定x在合法范围内后按照y排序,进行扫描线. */ #include<bits/stdc++.h> using namespace std; bool vis[1050]; struct st{ void read(){ scanf("%d%d",&x,&y); } int

POJ 1151 Atlantis(线段树 + 扫描线)

转载请注明原文:http://www.cnblogs.com/burning-flame/p/5934653.html 题目链接:http://poj.org/problem?id=1151 题意: 给你 n 个矩形的对角线坐标,求 n 个矩形并集的面积. 做法: 扫描线 + 线段树. 因为作线段树的题遇到了扫描线,只是粗浅的了解了一下. 就像字面上的:线性扫描一遍,对于每个单元,因为某些事件的发生会有一些变化. 举个例子: 现有长度为 n 的数组a,同时有 n 个区间覆盖[li, ri],对于

POJ 1177:线段树 离散化 扫描线

计算畸形区域的周长 比面积的扫描要麻烦些,原因就在不重叠区域的处理,同一段高度可能要重复叠加 所以线段树的结点里要多维护三个东西: times:区间里不重叠的区间数 比如说第一个区间是1~5,第二个是2~6,,第三个是9~10,那前两个可以合成1~6,和第三个独立,则这个整体的times为2 为了维护times,我们需要lbd和rbd两个变量,分别作为区间左右端点是否被覆盖的标志 有的博客里把这两个变量写成了bool型,这些其实不好,在运算时会带来麻烦,我们直接用int 0和1表示会好些.这样只

[UVA Live 12931 Common Area]扫描线

题意:判断两个多边形是否有面积大于0的公共部分 思路:扫描线基础. #pragma comment(linker, "/STACK:10240000") #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb push_back #define mp make_pair #define all(a) (a).begin(), (a).end() #de