扫描线略解

问题引入

求 \(n\) 个矩形的面积并。\(1\leq n\leq 10^5\)。

离散化坐标

首先,通过离散化,可以让矩形的坐标从 \(10^9\) 级别降至 \(10^5\) 级别。

尽管如此,开一个 \(N^2\) 的二维数组来存储坐标系里的每个点,仍然还会导致空间超限。

扫描线

本章节中,部分图片来自这里


看到图中的虚线了吗?想想有一条平行于 y 轴的直线从左往右扫过图形,那么这 \(n\) 个矩形的面积并就转化成:每个时刻这条直线与图形相交的线段长之和。

我们发现,一个时刻,相交的线段长可以用线段树维护并算出来,于是我们只要先把矩形排序,让这条线从左往右扫一次图形就统计出面积交了。时间复杂度 \(O(n\log n)\)。

例题

求 \(n\) 个矩形的面积并。\(1\leq n\leq 10^5\)。

参考代码
(略)

原文地址:https://www.cnblogs.com/yhmaster/p/11787623.html

时间: 2024-10-16 17:51:07

扫描线略解的相关文章

io流函数略解(java_input流)[二]

背景 在写这篇随笔之前,已经写了io流函数略解(java_File)(一),主要是总结了File的一些操作,以及一些源码介绍. 在Io实际应用中,实际上运用在如果会操作File,实际上很难写出一点能实际应用的code,因为操作文件嘛,更多的是操作流,也就是steam. 下面将简单总结一些流的概念,以及流的一些基本理论,同时也会贴出源码来略看. 实践 io之所以叫io,i的意思是input,o的意思是output,也就是一个输入一个输出,分别对应read与write. inputsteam inp

最短路算法略解

Part 0. 最短路是解决这类问题的,给定一个图 $ G = (V,E) $ ,以及图中各边的距离,询问两点间的最短路径是多少.常用的有以下几种算法. Part 1. Dijkstra算法 能够计算一个节点到其他所有节点的最短路径.前提是 $ G $ 中的边的权值均不为负. 下面是我的代码习惯: $ G[i][j] $ 表示节点 $ i $ 和节点 $ j $ 之间的距离 $ N $ 表示节点个数. $ st $ 表示起点. $ inf $ 表示一个很大的数 若 $ G[i][j] = inf

略解简单工厂模式

之前在一家公司笔试的时候有过这样一道题:请用一种面向对象语言实现计算器控制台程序,输入两个数字和运算符号,输出结果. 一开始脑子里想到的是这样滴: 1 package com.edu.shnu.patternstudy; 2 3 import java.util.Scanner; 4 5 public class Caluate { 6 public static void main(String[] args) { 7 try{ 8 System.out.print("请输入数字m:"

Centos 5/6启动过程略解

CentOS(RHEL)系列操作系统的启动流程:Intel X86兼容架构 系统初始化流程(内核级别)POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(内核核心文件只能放置在基本分区上) [--> ramdisk] --> rootfs(read-only) --> /sbin/init 1.POST:Power-On Self Test,加电自检:  ROM:Read-Only Memory,只读存储

easyui datagrid 分页略解

easyui datagrid 本身自带了分页功能. 但是这个需要你自己控制. 在后台可以得到两个datagrid的参数,rows 和page.其中rows是每页要显示的个数,page是第几页.单纯的设置rows是不行 的,datagrid真正显示的是你 从数据库里得到的真正条数,应该用rows当查询条件,得到rows条才行. 传到前台的json传应该是这样的: {"total":50,"rows":[{"sex":"nan16&quo

Nginx1.10.2稳定版本tcp四层负载安装配置过程略解

nginx1.10.2(2016.10.18)是最新稳定版,适合线上运行,最新开发版为1.11.8(2016.12.27) 系统版本CentOS6.8 64位,所有依赖都是系统rpm包,由于epel-release的nginx包不是最新的稳定版本所以选择源码包安装nginx通过源码编译安装 参考资料 https://www.biaodianfu.com/centos-7-2-install-nginx-1-10-2.html 1.安装编译所需工具 yum groupinstall "Develo

Java synchronized同步 各方式略解

近段为了实现一个功能,在树结构中,修改某个节点名称时,需要同时修改这个节点所有子节点的节点全路径属性字段(类似"父父节点名称/父节点名称/子节点名称/子子节点名称"的构造).因为在构造Update语句时,需要递归去查询子节点以及构造全路径的值,需要花费了一定的时间,等批量执行update语句时,可能子节点的某个子节点的名称又改变了,会引起冲突,故用到了synchronized,顺便了解了下实现方式,原理没深入了解,在此记录以便日后查看. ------------------------

android ble蓝牙开发略解

Android 蓝牙4.0开发 1.  权限和相关属性 “android:required="true"表示apk只有在具有bluetooth_le属性的系统里运行,这个4.3之前android系统没有 <uses-featureandroid:name="android.hardware.bluetooth_le"android:required="true"/> <uses-permissionandroid:name=&q

iOS中的round、ceil、floor函数略解

苹果官方文档位置:usr/include > math.h extern float ceilf(float); extern double ceil(double); extern long double ceill(long double); extern float floorf(float); extern double floor(double); extern long double floorl(longdouble); extern float roundf(float); ex