首页 > 其他分享 >扫描线学习笔记

扫描线学习笔记

时间:2024-07-29 22:07:30浏览次数:8  
标签:dat int 笔记 学习 扫描线 x2 x1 sg

扫描线是一种算法思想,其特征为将静态 \(k\) 维问题转化为动态 \(k - 1\) 维问题。动态 \(k - 1\) 维问题往往需要数据结构维护。

例题

【模板】扫描线

题意:求矩形面积并,其中每个举行的四边平行于坐标轴。

考虑扫描线,将静态 \(2\) 维问题转化为动态 \(1\) 维问题。

具体的,考虑按 \(y\) 轴排序每根与 \(x\) 轴平行的线段。随后逐个枚举并使用线段树维护。这里不特别讲线段树维护,可以理解为需要一个区间加查区间非零个数(保证全局查询)的线段树,可以自行去看题解。

代码:

#include <iostream>
#include <algorithm>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
using namespace std;
struct segment {
	int y, x1, x2, mk;
	segment(int y = 0, int x1 = 0, int x2 = 0, int mk = 0): y(y), x1(x1), x2(x2)\
	, mk(mk) {}
	bool operator<(segment o) {
		return y < o.y;
	}
}sg[2000010];
int x[2000010], x1, y1, x2, y2, n, cnt, ans;
struct d {
	int l, r, tot, len;
	d(int l = 0, int r = 0, int tot = 0, int len = 0):l(l), r(r), tot(tot)\
	, len(len) {}
}dat[8000010];
void pushUp(int p) {
	if (dat[p].tot > 0) {
		dat[p].len = x[dat[p].r + 1] - x[dat[p].l];
	} else {
		dat[p].len = dat[2 * p].len + dat[2 * p + 1].len;
	}
}
void build(int p, int l, int r) {
	if (l == r) {
		dat[p] = d(l, r, 0, 0);
	} else {
		dat[p] = d(l, r, 0, 0);
		int mid = (l + r) / 2;
		build(2 * p, l, mid);
		build(2 * p + 1, mid + 1, r);
	}
}
void modify(int p, int cl, int cr, int v) {
	int l = dat[p].l, r = dat[p].r;
	// cout << p << " " << l << " " << r << "\n";
	if (x[r + 1] <= cl || x[l] >= cr) {
		return;
	}
	if (x[l] >= cl && x[r + 1] <= cr) {
		dat[p].tot += v;
		pushUp(p);
		return;
	}
	modify(2 * p, cl, cr, v);
	modify(2 * p + 1, cl, cr, v);
	pushUp(p);
}
signed main() {
	cin >> n;
	rep (i, 1, n) {
		cin >> x1 >> y1 >> x2 >> y2;
		sg[2 * i - 1] = segment(y1, x1, x2, 1);
		sg[2 * i] = segment(y2, x1, x2, -1);
		x[2 * i - 1] = x1;
		x[2 * i] = x2;
	}
	n *= 2;
	sort(sg + 1, sg + n + 1);
	sort(x + 1, x + n + 1);
	cnt = unique(x + 1, x + n + 1) - x - 1;
	build(1, 1, cnt - 1);
	rep (i, 1, n - 1) {
		modify(1, sg[i].x1, sg[i].x2, sg[i].mk);
		rep (j, 1, 3) {
			// cout << dat[j].l << " " << dat[j].r << " " << dat[j].tot << " " << dat[j].len << "\n";
		}
		// cout << dat[1].len << "\n";
		ans += dat[1].len * (sg[i + 1].y - sg[i].y);
	}
	cout << ans << "\n";
}

标签:dat,int,笔记,学习,扫描线,x2,x1,sg
From: https://www.cnblogs.com/IANYEYZ/p/18331170

相关文章

  • 【Java】韩顺平Java学习笔记 第19章 IO流
    文章目录文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream&BufferedOutputStream对象流:Obje......
  • 算法笔记|Day11二叉树
    算法笔记|Day11二叉树☆☆☆☆☆leetcode144.二叉树的前序遍历题目分析代码☆☆☆☆☆leetcode94.二叉树的中序遍历题目分析代码☆☆☆☆☆leetcode145.二叉树的后序遍历题目分析代码☆☆☆☆☆leetcode102.二叉树的层序遍历题目分析代码☆☆☆☆☆leetcode107.......
  • 嵌入式学习之路 6(C语言基础学习——循环控制)
    目录一、构成循环的要素二、循环语句1、while(表达式)2、do-while3、for循环4、break和continue一、构成循环的要素1、在C语言中,构成循环的要素主要包括以下几个方面:1. 循环控制变量:用于控制循环的执行次数和条件。它通常在循环开始前进行初始化,并在每次循环迭代中进......
  • 嵌入式学习之路 7(C语言基础学习——数组)
        数组是一组相同类型数据的集合,也是一组相同类型变量的集合,同时数组本身也是一种数据类型。    在需要定义多个相同类型的产量时,按照以往的方法一个一个定义就相当繁琐,而数组可以批量处理多个数据。一、一维数组1、数组语法:类型说明符 数组名 [常量......
  • 学习笔记(b站小土堆)
    一、torchvision中的数据集使用CIFAR10结果,图片展示为一只猫二、DataLoader的使用结果测试集当中的第一个数据是一个三通道(RGB),是个彩色的图片,尺寸为32*32,对应的target是3batch_size=4就是从当中去取test_data[0]、test_data[1]、test_data[2]、test_data[3],把对应......
  • PyTorch深度学习快速入门(中)
    PyTorch深度学习快速入门(中)一、Containers(神经网络的基本骨架)(一)Module的使用(二)Sequential的使用<搭建小实战>二、ConvolutionLayers(卷积层)(一)torch.nn.functional中conv2d的使用(二)torch.nn中Conv2d的使用三、Poolinglayers(池化层)(一)池化层的介绍(二)MaxPool2d的......
  • 函数的学习(一)
    1.定义C语言的函数是一段可被重复调用的代码块,可以执行特定的任务并返回一个值。每个函数由函数头、函数体和函数返回值组成。2.函数的分类C语言中的函数可以根据不同的特性进行分类,常见的分类如下:(1)标准函数(库函数):这些函数是C语言提供的预定义函数,可以直接在程序中调用。标......
  • 02 Go语言开发REST API接口_20240728 课程笔记
    概述如果您没有Golang的基础,应该学习如下前置课程。Golang零基础入门Golang面向对象编程GoWeb基础基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。视频课程最近发现越来越多的......
  • 《Redis设计与实现》读书笔记-客户端
    目录1.Client简介2.客户端属性1)(本文重点)比较通用的属性2)(后续分享)另外一类是和特定功能相关的属性2.1套接字文件描述符2.2名字2.3标志(flag)2.4输入缓冲区2.5命令参数和个数2.6命令函数2.7输出缓冲区3.总结1.Client简介Redis服务器是典型的一对多服务器程序:一个......
  • 2024年必备技能:小红书笔记评论自动采集,零基础也能学会的方法
    摘要:面对信息爆炸的2024年,小红书作为热门社交平台,其笔记评论成为市场洞察的金矿。本文将手把手教你,即便编程零基础,也能轻松学会利用Python自动化采集小红书笔记评论,解锁营销新策略,提升个人竞争力。一、引言:为什么选择小红书数据采集?在小红书这片内容营销的热土上,笔记评论蕴......