【Luogu P5490】扫描线

洛谷P5490 扫描线 扫描线的学习 参考了以下博客: 线段树+扫描线(有关扫描线的理解) 扫描线 做题:洛谷P5490 扫描线 #include <bits/stdc++.h> #define ios std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); using namespace std; typedef long long ll; const int maxn = 1e6 + 10; int mark[maxn<<2];//记录某个区 阅读详情

Luogu P5490

作为一道模板题让我卡了一个月……

对于线段树+离散化新手而言这实在是太难了……

有关离散化:

可以查看这一篇文章:https://www.jianshu.com/p/9347659dcf18
一种缩小数据范围的小技巧,在本题中用于缩短线段树的区间大小

基本思路

想象一条直线,从左往右扫,我们要计算的就是直线扫过的面积。

很容易可以想出把整个图形按照每一条竖线切割,分割成几个矩形。

具体做法可以看代码。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long tag[1600005],tree[1600005],cnt,ans,n,x,x2,y,y2,line[1600005];
struct data
{
	long long x,l,r,flag;
}edge[1600005];
bool comp(data a,data b)
{
	if (a.x!=b.x)return a.x<b.x;
	else return a.l<b.l;
}
/*void push_down(int root,int l,int r)
{
	int lson=root<<1;
	int rson=root<<1|1;
	int mid=(l+r)>>1;
	tag[lson]+=tag[root];
	if (tag[lson]) tree[lson]=line[mid]-line[l];
	tag[rson]+=tag[root];
	if (tag[rson]) tree[rson]=line[r]-line[mid];
	tag[root]=0;
}*/
void add(int root,int l,int r,long long al,long long ar,int num)
{
	if (al<=line[l]&&line[r]<=ar) 
	{
		tag[root]+=num;
		if (!tag[root]) tree[root]=tree[root<<1]+tree[root<<1|1];
		if (tag[root]) tree[root]=line[r]-line[l];
		return ;
		//tag存储节点代表的区间被覆盖的次数
		//tree存储节点代表的区间被覆盖的长度
		//值得注意的是,即使当前区间没有被完全覆盖,tree[root]也不一定为0。 
	}	
	if (l+1==r) return ;
	if (ar<=line[l]||al>=line[r]) return ;//加入等号是因为若只有端点相同,实质上也是没有交集的。 
	//push_down(root,l,r);
	//无需pushdown的原因为:对于任意一个区间,完全覆盖它的竖线一定是成对的(因为有左右两边),即有进有出,不可能会出现负值。
	//并且对于任意区间的子区间,子区间是否被覆盖或者被覆盖的长度对父区间毫无影响
	//如果加入pushdown,会导致超时。 
	int mid=(l+r)>>1;
	if (al<line[mid]) add(root<<1,l,mid,al,ar,num);
	if (ar>line[mid]) add(root<<1|1,mid,r,al,ar,num);
	if (tag[root]==0) tree[root]=tree[root<<1]+tree[root<<1|1];
	else tree[root]=line[r]-line[l];
	
}
int main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++) 
	{
		scanf("%lld%lld%lld%lld",&x,&y,&x2,&y2);
		edge[++cnt].x=x;
		edge[cnt].l=y;
		edge[cnt].r=y2;
		edge[cnt].flag=1;
		line[cnt]=y;
		edge[++cnt].x=x2;
		edge[cnt].l=y;
		edge[cnt].r=y2;
		edge[cnt].flag=-1;
		line[cnt]=y2;
		//edge记录竖线的位置 
		//line记录每一个点的位置,方便离散化处理 
	}
	sort(edge+1,edge+1+cnt,comp);
	sort(line+1,line+1+cnt);
	int newend=unique(line+1,line+1+cnt)-line-1;//去重函数,此时newend恰好是line最后一个元素的下标 
	for (int i=1;i<cnt;i++)
	{
		add(1,1,newend,edge[i].l,edge[i].r,edge[i].flag);
        ans+=tree[1]*(edge[i+1].x-edge[i].x);//整个区间被覆盖的总长度*到下一条竖边的距离,得到这一部分的面积 
        //最后一条竖边不需要处理 
	}
    printf("%lld",ans);
	return 0;
}
银河麒麟V10 SP3离线安装Nginx1.21.5全记录(附11个rpm包下载清单) 本文详细记录了在银河麒麟V10 SP3操作系统上离线安装Nginx 1.21.5的全过程,包括11个必备rpm包的下载清单。通过分步骤的实战指南,帮助用户在国产化环境中高效部署Nginx服务,涵盖安装、配置、调优及故障排查等关键环节,特别适合金融、政务等对安全性要求高的场景。 阅读详情

相关推荐

【ANSYS Workbench仿真】命令流:压力渗透pressure penetration

对与流体接触的part添加边界压力,使流体压力渗透点的接触应力与流体压力相等,以便得到真实的变形结果,就需要用到“pressure penetration”。 但是在ansys中,只能通过ADPL的形式添加,即在workbench中添加命令流的形式。此文主要介绍了**压力渗透的添加要点**和**命令流使用说明**。

路边小M's Blog 1万+

P5490 【模板】扫描线

题解 学习博客↓ 题解 P5490 【【模板】扫描线】 【学习笔记】扫描线 扫描线建议纸上模拟一遍,这样才更加清晰 记几个重点: 假设从下往上扫描, 每条边按照 yyy 值坐标从小到大排序,标记其是矩形的上底(标记为+1),还是下底(标记为-1) 这样,对于每个矩形,扫描线总是会先碰到下边,然后再碰到上边 建立一棵线段树,其每个端点维护一条线段(也就是一个区间)的信息: 1.该线段被覆盖了多少次(...

Yubing792289314的博客 361

【推荐100个unity插件之24】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

【推荐100个unity插件之23】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1682

Luogu5490 【模板】扫描线(矩形的面积并)

原题链接:https://www.luogu.com.cn/problem/P5490 【模板】扫描线 题目描述 求 nnn 个矩形的面积并。 输入格式 第一行一个正整数 nnn。 接下来 nnn 行每行四个非负整数 x1,y1,x2,y2x_1, y_1, x_2, y_2x1​,y1​,x2​,y2​ ,表示一个矩形的左下角坐标为 (x1,y1)(x_1, y_1)(x1​,y1​),右上角坐标为 (x2,y2)(x_2, y_2)(x2​,y2​)。 输出格式 一行一个正整数,表示 nnn 个矩形的并

ShadyPi的IT笔记 487

31、贝叶斯认知建模与隐马尔可夫模型:理论与应用

本文探讨了贝叶斯认知建模与隐马尔可夫模型(HMM)的理论基础及其在认知科学和神经科学中的应用。重点介绍了贝叶斯定理和HMM的基本原理,并结合实际案例,如情绪识别系统和脑机接口(BCI),展示了它们在处理复杂认知任务中的强大能力。文章还讨论了贝叶斯-HMM模型的技术细节、优势与局限性,以及未来的发展前景。

meat5的博客 141

Python爬虫实战:基于最新技术爬取国家企业信用信息公示系统数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的国家企业信用信息公示系统爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、数据解析与存储等高级话题,最终实现一个完整的爬虫系统。文章包含大量实战代码示例,适合中高级Python开发者学习参考。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和商业情报收集等领域。通用爬虫:如搜索引擎爬虫,广泛抓取互联网公开信息聚焦爬虫:针对特定领域或网站的数据采集增量式爬虫:只抓取更新内容,减少资源消耗。

2201_76125261的博客 2405

P5490 【模板】扫描线(扫描线求面积)

题目链接:点击这里 题目大意: 给出 nnn 个矩形的对角坐标求矩形面积的交集 题目分析:

羊驼的博客 277

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1245

洛谷P5490 【模板】扫描线

半年前就听说过一种名为扫描线的神秘科技,但实际上学过后会发现其实就是一种线段树的用法,其中扫描线的线段树还和普通的线段树有所不同,一个是每个节点实际上是映射1e9的值,其次需要同时维护两棵线段树:flag记录当先节点是否全部被覆盖(只记录最深处的值且不pushup);sum记录当先线段中扫描到的长度(需要pushup但由于每次都是只用访问sum[1]所以不用pushdown)。另外需要注意的另外一...

圣诞老头的博客 498

辐射制冷无规散射结构非球形散射体的结构优化与设计准则

本文针对辐射制冷材料中非球形散射体的光散射特性开展研究,提出了一种基于体积散射截面和不对称因子的综合评价方法。通过建立简化模型分析球体、圆柱体、长方体等六种几何形状在太阳波段的散射性能,发现金字塔形和圆锥形具有更强的后向散射能力。研究创新性地提出"反射因子SR=S(1-g)"这一评价参数,该参数与宏观反射率高度相关,为非球形散射体的优化设计提供了定量依据。仿真结果表明,合理选择散射体形状可显著提升辐射制冷材料的太阳反射率,为实现高效被动制冷提供了新的结构设计思路。

huanghm88的专栏 79

硬件工程师入门基础知识(一)基础元器件认识(二)

我们的电路输入一般是只有两种状态,0V 或者是其它的高电平(1.8V,3.3V,5V 等),截止状态一般不用怎么考虑,因为如果让三极管的 Vbe=0,自然就截止了,重要的是饱和状态如何保证。也就是说只要 Rb

小幽余生不加糖 1万+

OI 扫描线的基本知识(未完成)

一、扫描线算法是什么 从字面上来理解,扫描线其实就是一根线在图里从下往上扫一遍。 以下面这张图举个栗子: 我们可以用与xxx轴平行的几条线(粉色线)把这几个矩形分成几段: 此时,每一小块的面积为底×××高。 ...

RabbieWjy的博客 2823

【异常检测】【EfficientAD】论文简单梳理与代码实现

EfficientAD作为较近的一篇异常检测网络,主要还是从S-T网络入手,对齐进行了相关改进。修改特征提取器引入自动编码器hard loss以及惩罚项。

胡侃有料的博客 2854

【扫描线】【模板】

Luogu P5490 洛谷终于没有板子题卡板子了,好感动 扫描线 常用来求矩形面积并(似乎还有周长并? ) 主要思想 将每个矩形看做两条线段,利用差分思想,一条+1,一条-1 将每个矩形这样转换后,X轴从左往右依次扫过去,维护在Y轴存在的线段 用线段树维护,其中一维离散 就是这样喵!复杂度O(nlogn)O(nlog_n)O(nlogn​) 具体还是看代码吧。。。(这个似乎是板子库的来着。。。还...

ygmjsjdboy的博客 184

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【模板】扫描线

主要讲一个关于计算几何的扫描线算法。。 基础算法:动态开点 + 离散化 你考虑面积求交转化成线段求交即可。 #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define fi first #define se second #define db double using namespace std; const int Maxn=2e5+5; int n,rt,tot,cnt,cnt2,n

cqbzlydd的博客 179

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

洛谷模板汇整

洛谷模板汇整

Demilly123的博客 883

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

洛谷 P5490 【模板】扫描线

求 nnn 个矩形的面积并 思路:扫描线 #include<iostream> #include<cstdio> #include<algorithm> #define ls (x<<1) #define rs (x<<1|1) #define MAXN 1000010 using namespace std; typedef long long ll; int n,x1,x2,y1,y2,X[MAXN<<1]; struct Scan

wineandchord 304

洛谷P5490扫描线

洛谷5490

Colinnian的博客 345

[Luogu 3415] 祭坛 (扫描线+BIT)

题目描述: 题目描述太长辣,而且难懂。 其实一个祭坛点只需要找它左边上边下边右边各一个点就可以形成一个需要的保护网。 那么一个祭坛点最多的保护层数即为MIN(上面水晶柱个数,下面水晶柱个数,左边水晶柱个数,右边水晶柱个数). 题目分析: 首先我们可以开一个Vector 记录每个行上有多少的水晶柱. 二分一个答案 用扫描线从上到下扫描。 维护两个数组 UP&amp;DOWN ...

HT008的Blog 352

洛谷 U5872 作弊

思路

依然一笑作春温。 1973

洛谷P1262

洛谷1262 间谍网络本题地址http://www.luogu.org/problem/show?pid=1262题目描述由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了

QWsin的博客 731

杂物_洛谷1113_拓扑排序

题目描述John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工

olahiuj的博客 806
上一篇: 【Luogu P1981】表达式求值
下一篇: 【Luogu P1878】舞蹈课
苟岂
博客等级 码龄10年 20粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值