覆盖的面积 HDU - 1255(线段树+扫描线求二次重叠面积)

HDU-1255 覆盖的面积(线段树扫描线+离散化+改进后超快的算法) 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 阅读详情

覆盖的面积

HDU - 1255

给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.

 

Input

输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.

注意:本题的输入数据较多,推荐使用scanf读入数据.

Output

对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.

Sample Input

2
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
3
0 0 1 1
1 0 2 1
2 0 3 1

Sample Output

7.63
0.00

题意中文,不解释

这题的代码在一般的线段树求面积并的基础上进行了修改,但是所用的思想是一样的,所以不难理解

回忆一下一般的求矩形覆盖面积,线段树节点里面有一个重要的变量,cnt。这个变量表示了该节点表示的区间被完全覆盖,如果cnt=0,说明没有被完全覆盖(但不代表没有被覆盖),要算出该节点所代表的区间被覆盖的长度,需要由它左右孩子节点被覆盖的长度相加所得。如果cnt=1,表示被完全覆盖,覆盖长度就是该区间长度。如果cnt>1说明也是被完全覆盖,不过不止覆盖了一次,在算覆盖长度的时候,和cnt=1的计算方法是一样的。注意一点,节点里还有另一个变量len,就是该区间被覆盖的长度,但是我们注意一下,这个len准确的意义应该是,被覆盖了一次或以上的长度,只是这个意义在一般的求面积问题中,不需要过分强调

 

而在这题中我们要计算被覆盖两次或以上的部分面积,我们在线段树节点中增设了一个变量,ss,其中s表示该该区间内被覆盖了1次或以上的长度,ss表示被覆盖了2次或以上的长度

我们是怎么计算最后的面积的?一样的道理,从下往上扫描矩形,每次添加一条矩形上下边,然后看看t[1].ss是多少,再乘上高度差。因为t[1]表示了总区间,而ss表示被覆盖两次或以上的长度,即计算时我们忽略掉只被覆盖一次的长度

问题的关键变为怎么计算一个节点的ss

分情况讨论

1.cnt>1 : 说明该区间被覆盖两次或以上,那么长度就可以直接计算,就是该区间的长度

剩下的情况就是cnt=1或cnt=0

2.先看叶子节点,因为是叶子没有孩子了,所以被覆盖两次货以上的长度就是0(无论cnt=1或cnt=0都是0,因为是叶子。。。)

3.不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么,应该是,可以确定,这个区间被完全覆盖了1次,而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了,只要加上t[lch].s + t[rch].s  即,看看左右孩子区间被覆盖了一次或以上的长度,那么叠加在双亲上就是双亲被覆盖两次或以上的长度

3.不是叶子节点,且cnt=0,确切的意义应该是不完全不知道被覆盖的情况(不知道有没有被覆盖,被覆盖了几次,长度是多少都不知道),这种情况,只能由其左右孩子的信息所得

t[lch].ss + t[rch].ss  , 即直接将左右孩子给覆盖了两次或以上的长度加起来,这样才能做到不重不漏

注意!!始终是下边为1,上边-1,因为只有这样,标记覆盖次数cnt才能是正的,题目题意有问题和输入样例不符,按照输入样例为准

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ls i<<1
#define rs i<<1|1
#define m(i) ((q[i].l+q[i].r)>>1)
typedef long long ll;
const int N = 1004;
struct Edge{//扫描线
	double l,r;
	double h;
	int f;
	bool operator < (const Edge &a)const{
		return h < a.h;
	}
}e[N<<1];
struct Node{
	int l,r;
	int s;//该区间到覆盖状态
	double len1;//覆盖1次及以上的长度
	double len2;//覆盖2次及以上的长度
}q[(2*N)<<2];
double x[N<<1];
void pushup(int i){
	if(q[i].s){
		q[i].len1 = x[q[i].r+1] - x[q[i].l];
	}
	else if(q[i].l == q[i].r){
		q[i].len1 = 0;
	}
	else{
		q[i].len1 = q[ls].len1 + q[rs].len1;
	}
	//下面是不同于1次覆盖的部分
	if(q[i].s > 1){//该区间完全覆盖2次及以上
		q[i].len2 = x[q[i].r+1] - x[q[i].l];
	}
	else if(q[i].l == q[i].r){
		q[i].len2 = 0;
	}
	else if(q[i].s == 1){
		//这里可能需要理解一下,s=1说明这个区间要被
		//完整覆盖,但是之前子区间已经有的被覆盖了1次
		//这个时候我们只需要找这个区间左右子区间覆盖1次的就行了,加上这次完全覆盖就是2次了
		q[i].len2 = q[ls].len1 + q[rs].len1;
	}
	else{
		//如果覆盖0次那么只能去子区间内找覆盖两次的了
		q[i].len2 = q[ls].len2 + q[rs].len2;
	}
}
void build(int i,int l,int r){
	q[i].l = l;
	q[i].r = r;
	q[i].s = q[i].len1 = q[i].len2 = 0;
	if(l == r) return;
	int mid = m(i);
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void update(int i,int l,int r,int f){
	if(l == q[i].l && q[i].r == r){
		q[i].s += f;
		pushup(i);
		return;
	}
	int mid = m(i);
	if(r <= mid) update(ls,l,r,f);
	else if(l > mid) update(rs,l,r,f);
	else{
		update(ls,l,mid,f);
		update(rs,mid+1,r,f);
	}
	pushup(i);
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		int tot = 0;
		double x1,x2,y1,y2;
		for(int i = 1; i <= n; i++){
			scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
			Edge &t1 = e[tot];
			Edge &t2 = e[tot+1];
			t1.l = t2.l = x1;
			t1.r = t2.r = x2;
			t1.h = y1;
			t1.f = 1;
			t2.h = y2;
			t2.f = -1;
			x[tot] = x1;
			x[tot+1] = x2;
			tot += 2;
		}
		sort(x,x+tot);
		sort(e,e+tot);
		int k = 1;
		for(int i = 1; i < tot; i++){
			if(x[i] != x[i-1])
				x[k++] = x[i];
		}
		build(1,0,k-1);
		double ans = 0.0;
		for(int i = 0; i < tot; i++){
			int l = lower_bound(x,x+k,e[i].l) - x;
			int r = lower_bound(x,x+k,e[i].r) - x -1;
			update(1,l,r,e[i].f);
			ans += q[1].len2 * (e[i+1].h - e[i].h);
		}
		printf("%.2f\n",ans);
	}
	return 0;
}

 

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码) 本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。 阅读详情

相关推荐

MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50)

本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。

weixin_29062671的博客 587

算法119:矩形面积

输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2。输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2。第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。

Winn~ 370

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 353

[算法系列之二十三]线段树(Interval Tree)

一 背景 在信息学竞赛中,我们经常会碰到一些跟区间有关的问题,比如给一些区 间线段求并区间的长度,或者并区间的个数等等。这些问题的描述都非常简单,但是通常情况下数据范围会非常大,而朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解。这时,我们需要一种高效的数据结构来处理这样的问题,在本文中,我们介绍一种基于分治思想的数据结构—-线段树。 二 简介 线段树是一种二叉树形结构,属于平...

SmartSi 884

太美了!现代女主jk海军风穿搭四视图

哪个女孩子初高中的时候不买几套JK衣服啊,穿上完全是青春女孩。那还愣着干啥,不得也给你的漫剧女主也穿上!直接就是分享三套JK穿搭,红棕双麻花辫配经典水手服,是那种乖乖巧巧的元气学妹;粉色羊毛卷双马尾,搭配蝴蝶结和小挎包甜度直接拉满;还有灰棕色侧麻花辫,浅蓝上衣配黑色百褶裙,温柔里又带点小酷。下面把这三套角色的完整提示词分享出来,喜欢哪套就拿去参考,改改发型和配色,还能继续解锁新角色!

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 51

基于Simulink的发动机管理系统中的自适应增压控制系统设计

通过上述详细设计步骤,我们成功开发了一个基于Simulink的自适应增压控制系统。该系统不仅能够实时监测和预测发动机的运行状态,动态调整增压压力目标值,还具备实时监控、故障诊断和保护功能,确保系统的安全性和可靠性。此外,通过仿真实验和硬件在环测试,我们验证了系统的性能,并对其进行了优化,使其能够更好地满足实际应用需求。这个项目展示了如何利用MATLAB/Simulink的强大功能,结合控制理论和工程实践,开发出高效、可靠的自适应增压控制系统。

MHD0815的博客 220

扫描线求矩形覆盖面积、体积--入坑总结

扫描线思想:扫描线算法 被覆盖1次的区域面积 扫描线一个很经典的例题(HDU-1542-Atlantis):在坐标轴上有若干个矩形,问他们覆盖的面积总和。 因为他们覆盖的面积有重复,于是就用到了神奇的扫描线算法。 扫描线一般就是平行于x轴或者y轴的直线。通过这些直线我们可以把这些矩形覆盖的区域分成若干个子区域分别求面积最后再求和,如下图的区域就被分成了5个子区域。(我是以x轴建的线段树) 要求得...

qq_43803508的博客 2698

地下管网巡检机器人:基于YOLOv8与UI界面的智能化系统设计与实现

通过YOLOv8模型的目标检测功能结合实时视频流,我们能够实现对地下管网巡检机器人的智能化控制。系统通过图像识别技术帮助巡检人员快速识别管道中的各种缺陷和障碍物,从而提高巡检效率和准确性。未来,我们可以继续优化模型,增加更多的目标类别,并通过强化学习等方法提高机器人的自主巡检能力。此外,随着硬件技术的发展,未来的巡检机器人可能会具备更强的感知能力和更高的智能水平。

YOLO 529

【HDU1255】【扫描线 —— 矩形面积交】覆盖的面积

题意:       本题是扫描线的典型应用,就是求矩形的面积交。与本题相关的题就是HDU1542,求矩形面积并。   思路:       我们先来讨论一下扫描线的本质。扫描线算法其实就是先将所有的 y 坐标进行离散化,然后用所有离散的点建立一棵线段树,这棵线段树的每一个节点的左右端点就代表空间中 y 坐标上的一段区间。       然后我们再将每一个矩形的左右两条边抽出来,进行排序,然后...

lucius-liu.cn 733

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】

随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。

一键难忘的博客 2862

矩形的面积

给定二维笛卡尔坐标系下两个边平行于坐标轴的矩形。请计算这两个矩形所覆盖的区域的面积。 输入描述 输入第一行为四个整数 ,表示第一个矩形的两个对角坐标 ; 第二行为四个整数,表示第二个矩形的两个对角坐标 。 输出描述 每组测试用例在单独的一行上输出一个整数表示输入的两个矩形覆盖的区域的总面积。 样例说明 对于第一组样例,其可视化如下图。 对于第二组样例,其可视化如下图。 对...

CN_BIT的博客 1267

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ 1177 Picture & HDU 1255 覆盖的面积 【线段树+离散化+扫描线】

题目来源: POJ http://poj.org/problem?id=1177 HDU :http://acm.hdu.edu.cn/showproblem.php?pid=1255 ★实在是蔡,扫描线居然硬是看了一天,就发篇博客说说叭 扫描线: 扫描线一般运用在图形处理上面,来解决一些周长 面积的问题(比如 给你很多矩形的位置,让你求他们总共的面积,注意这里的矩形可以重叠,所以问题就变得复杂了...

HungTeen的博客 427

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

覆盖的面积 HDU - 1255(线段树,扫描线)

覆盖的面积 题目链接:HDU - 1255 题意:若干矩形重叠在一起,求出重叠部分的面积之和,如下图,求出红色区域面积; 之前算过整个图形的面积,而今要算重叠部分的面积,还是原来的思路,接着动用那条墨绿的扫描线; 和之前有些许不同的是扫描线要扫过两次才能出现重叠区域,那么如何用线段树维护区间[l, r]被覆盖次数大于1的长度呢? 先回想一下用线段树维护区间[l, r]被覆盖的长度的...

Sirius_han的博客 424

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HDU_1255_扫描线求二次覆盖的面积(线段树)

HDU 1255 在求所有覆盖面积的前提下,求出矩形被覆盖超过2次的区域面积 线段数维护一个len2,表示覆盖>=2次的长度,len1表示覆盖>=1次的长度 add代表区间覆盖的次数 在pushup中,每次add被修改时和update结束时来维护线段树的值 先维护len1,在len1的基础上维护len2 在此之间将浮点坐标存下来(离散化),然后排序并且去重,这样每一个浮点坐标都...

_llc的博客 213

HDU 1255-覆盖的面积(线段树+扫描线)

C - 覆盖的面积 Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1255 Appoint description:  System Crawler  (2016-04-30) Description

梧桐下的四叶草 906

hdu 1255 覆盖的面积(矩形面积并,多次覆盖)

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1949    Accepted Submission(s): 960 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过

志当存高远 1254

hdu1255 覆盖的面积 (线段树扫描线, 矩形覆盖至少两次的面积)

问题描述 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 494

HDU 1255(线段树&离散化&扫描线)详细解析

题目链接 题目解析: 该题目要求 求取众多矩形重叠部分的面积,可以采用扫描线的方法来解决。 扫描线 首先来看一个利用扫描线实现的 计算所有矩形覆盖区域面积(不算重复面积)的求解过程。 在下图中,利用蓝线从下往上扫描所有的平行于x轴的边,当接触到的是下边的时候,将该边对应的区间值都加上1(表示该区域又覆盖了一次),接触到上边的时候,减去1(该区域少覆盖一次)。 而每次扫描到边的时候,将所有上一次值不为0的区间(处于覆盖状态的区间)的区间长度和 lenlenlen 乘以两次扫描的高度差(hi−hi−1h_{i

龙卡的博客 827

HDU1255-覆盖的面积(线段树+扫描线——面积交)

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5801    Accepted Submission(s): 2899 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖

gyr 312

覆盖的面积 HDU - 1255 (扫描线+线段树)

覆盖的面积 HDU - 1255 (扫描线+线段树) 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下...

weixin_43179892的博客 213

【hdu】1255 覆盖的面积——扫描线求重叠面积和

原题链接 目录题目:解题思路:代码:碎碎念: 题目: 解题思路: 这题的思路和 【ACWing】247. 亚特兰蒂斯 的差不多,只不过线段树中需要多存储一个变量val2,记录区间内被覆盖2次及以上的线段的长度,在维护的时候,需要根据 cover 的值,分类讨论。 当 cover=0 的时候,代表该区间没有被全部覆盖过,那么该区间的 val1,val2 的长度分别是各自左子区间和右子区间长度之和; 当 cover>=2 的时候,代表该区间至少被完全覆盖了两次,那么 val1,val2 的长度都等于

Just__Do__IT__的博客 323

线段树扫描线算法

这个扫描线算法是用线段树完成的,一开始理解有点难度 http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 算法的思想请看这个blog 然后最近做几个扫描线练习一下(代码还是挺难写的啊,而且变式比较难) HDU 1542 题意:给你很多矩形,求矩形覆盖的面积 题解:这个就是模板题,理解了思想之后撸一遍模

Miracle_ma的专栏 1413

hdu1255 覆盖的面积(扫描线-矩形面积交)

题目 N(N<=1e3)个矩形,每个矩形提供左下角(x1,y1)和右上角(x2,y2)的点 四个坐标均为浮点数,且在0到1e5之间 求被矩形覆盖过至少两次的区域的面积,结果保留两位小数 思路来源 http://cache.baiducontent.com/c?m=9d78d513d9d431a54f9d94697d1cc0171c4381132ba7d7020ed28449e373...

小衣同学的博客 440

HDU1255 覆盖的面积 (线段树 + 扫描线)

题目链接:覆盖的面积 大致题意 现在有平面直角坐标系xoy, 有n个平行于x轴y轴的矩形, 给出这些矩形的左上角和右下角的坐标, 让你求出这些矩形组成的图形中被至少两个矩形覆盖的部分的总面积. 解题思路 如果你还没有做过这道题, 推荐点击链接先看一下这个题 这个题和上面给出超链接的题是几乎一模一样的, 我在这里不再多分析了, 唯一的区别就是要求计算至少被两个矩形的面积. 设当前区间被覆盖一次的长度为len1, 两次为len2, 那么我们类比于上一题的思路, 我们从小到大枚举x, 最终的结果只需要累加△x *

Fau的博客 479

【扫描线+离散+线段树】【面积并&面积交&周长并】HDU - 1542 && HDU - 1255 && HDU - 1828

【面积并】HDU - 1542 - Atlantis 题目链接&lt;http://acm.hdu.edu.cn/showproblem.php?pid=1542&gt; 题意: 给出若干个矩形的坐标,矩形之间存在重叠。问所有矩形覆盖的总面积是多少。 题解: 对于每个矩形抽象成两条线,每一个线记录:x轴坐标,上端点坐标,下端点坐标。另外对于每一条线记录一个属性val,如果这个线是矩形左边...

Eliot的博客 1258
上一篇: Picture POJ - 1177(线段树+扫描线入门)
下一篇: Beam Cannon HDU - 5091 (线段树+扫描线)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值