hdu 1542 线段树求矩形并+离散化

算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) 问题:给出若干个矩形,(给的是矩形左上角和右下角坐标),求最后所得图形的面积/周长; 三个矩形如左图所示,而若要计算面积,看右图,用3个矩形各自的面积之和减去重复部分(红色和蓝色)的面积 人算很简单,但是用算法怎么实现呢? 此类问题一般都是用线段树辅助扫描法来计算; 什么是扫描法?有什么用?怎么用? 可以想象成一根假想的线,将图从左往右或从右往左或自下而上或自上而下“扫描”一遍,至于 阅读详情

这里用到的线段树和我之前接触的有些区别。

具体思想在百度上都有

#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
#define ls o<<1
#define rs o<<1|1
#define N 210
void fre(){freopen("t.txt","r",stdin);}
using namespace std;
struct node{
    double x,y1,y2;
    int f;
}Line[N];
struct node1{
    double lf,rf,cnt;
    int l,r,c;
}tree[N*3];
double y[N];
int cmp(node a,node b)
{
    return a.x < b.x;
}
int cmp1(double a,double b)
{
    return a < b;
}
void bulid(int o,int l,int r)
{
    int m = l+(r-l)/2;
    tree[o].c=0;tree[o].cnt=0;
    tree[o].l=l;
    tree[o].r=r;
    tree[o].lf=y[l];
    tree[o].rf=y[r];
    if(l+1==r) return;//注意返回条件
    bulid(ls,l,m);
    bulid(rs,m,r);//注意这里不用mid+1
}
void calen(int t)
{
    if(tree[t].c>0)
    {
        tree[t].cnt=tree[t].rf-tree[t].lf;
        return ;
    }
    if(tree[t].l+1==tree[t].r) tree[t].cnt=0;
    else tree[t].cnt=tree[2*t].cnt+tree[2*t+1].cnt;
}
void updata(int t,node e)
{
    if(e.y1 <= tree[t].lf && e.y2>=tree[t].rf)
    {
        tree[t].c+=e.f;
        calen(t);
        return;
    }
    if(e.y1 < tree[2*t].rf ) updata(2*t,e);
    if(e.y2 > tree[2*t+1].lf) updata(2*t+1,e);
    calen(t);
}
int main()
{
   // fre();
    int i,n,ncase=0,t;
    double x1,y1,x2,y2,ans;
    while(scanf("%d",&n)!=EOF && n)
    {
        ncase++;
        t=1;
        for(i=1;i<=n;i++)
        {
            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
            Line[t].x=x1;
            Line[t].y1=y1;
            Line[t].y2=y2;
            Line[t].f=1;
            y[t]=y1;

            Line[t+1].x=x2;
            Line[t+1].y1=y1;
            Line[t+1].y2=y2;
            Line[t+1].f=-1;
            y[t+1]=y2;
            t+=2;
        }
        sort(Line+1,Line+t,cmp);
        sort(y+1,y+t,cmp1);
        bulid(1,1,t-1);
        ans=0;
        for(i=1;i<t;i++)
        {
            ans+=tree[1].cnt*(Line[i].x - Line[i-1].x);
            updata(1,Line[i]);
        }
        printf("Test case #%d\nTotal explored area: %.2lf\n\n",ncase,ans);
    }
    return 0;
}


hdu 1542 扫描线+线段树求矩阵面积并 这几天想啃啃树,无意中找到了这个题,一方面练习一下线段树,另一方面学习一下离散化和扫描线的技巧。       首先,离散化是必要的,因为x,y       显然,离散化的数据不会有重复,这里要介绍一个函数unique,如果现在有一个长度为n的数组unique(a,a+n)返回一个迭代器(也就是指针),它的作用是将a数组中相同的元素都只出现一次,unique(a,a+n)-a就是a中不相同元素的 阅读详情

相关推荐

扫描线(一)——求矩形面积并

前言 扫描线应该是一个很有用的算法。 它有许多用途,比较经典的应该就是用来求矩形面积并。 什么是矩形面积并 或许你会问,什么是矩形面积并? 在一个平面上,有若干个矩形,它们覆盖的总面积就是矩形面积并(重叠部分只算一次)。 要求矩形面积并,我们就可以用扫描线。 离散化 首先,我们要将这张图离散化预处理一下。 离散化的过程应该比较简单,将每个节点的坐标全部存在一个数组...

CXR的博客 1438

平面内有多个矩形,求矩形重叠数最多的区域包含的矩形数量?

import java.util.*; /**  * 平面内有多个矩形,求矩形重叠数最多的区域包含的矩形数量?  * 输入:  * 3  * 0 1 1  * 0 1 1  * 2 3 4  * 2 3 4  * 解释:  * 3:矩形个数  * (0,0)矩形1左下端点,(2,2)矩形1右上端点  * (1,1)矩形2左下端点,(3,3)矩形2右上端点  * (1,1)矩形3左下端点,(4,...

懒人闲得慌 3043

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3501

线段树求矩形并 离散化+扫描线

顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中,这根线很重要。方向的话,可以左右扫,也可以上下扫。方法是一样的,这里我用的是由下向上的扫描法。 如上图所示,坐标系内有两个矩形。位置分别由左下角和右上角顶点的坐标来给出。上下扫描法是对x轴建立线段树,矩形与y平行的两条边是没有用的,在这里直接去掉。如下图。 现想象有一条线从最下面的边开始依次向上扫描。线段树用来

colorfulshark 996

Win10+Anaconda环境下PaddleOCR保姆级安装指南(附常见报错解决方案)

本文提供Win10+Anaconda环境下PaddleOCR的保姆级安装指南,涵盖从环境配置到模型部署的全流程,特别针对常见报错提供解决方案。通过详细的步骤说明和实用技巧,帮助开发者快速完成PaddleOCR安装与测试,避免常见陷阱,提升OCR开发效率。

weixin_29096377的博客 375

从代码层面分析STM32 标准库和HAL库的差异

相当于每个设置都是独立的函数。HAL库将一段代码通过宏定义的方式封装成了一个函数,每个端口的时钟都单独的定义了一个名称,标准库是一个独立的函数,通过参数传递的方式来设置每个端口的时钟。这两个版本的函数本质上操作的还是寄存器,不过HAL库操作的只是BSRR寄存器,而标准库端口置1的时候操作的是BSRR寄存器,端口清0的时候操作的是BRR寄存器。标准库设置端口模式的时候,是在if语句中判断之后直接设置的,而HAL端口模式设置时,却使用了switch语句去设置,说明在HAL库中,端口模式和标准库中发生了改变。

HXYDJ的博客 2万+

Poj1151/HDU1542(求并矩形覆盖的面积)分别用离散化处理,矩形切割,线段树三种方法实现.

<br />题目链接:http://poj.org/problem?id=1151<br />             http://acm.hdu.edu.cn/showproblem.php?pid=1542<br /> <br />题意:给出任意n多矩形,求其总覆盖的面积.<br /> <br />可分别用离散化处理,矩形切割,线段树三种方法实现,以下分别为三种方法的代码:<br /> <br /> <br />离散化坐标:<br /> <br />#include<stdio.h> #includ

dooder_daodao的专栏 2842

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

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

小幽余生不加糖 1万+

HDU - 1542 求矩形面积并(线段树+离散化+扫描线)

There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe dif...

weixin_41934068的博客 419

风机叶片小规模振动监测数据集--读取测试

ETH风电叶片缺陷数据集–读取测试 数据简介 提示:这里可以添加本文要记录的大概内容: 结构健康监测是保障重要机电设备、建筑设施健康的重要技术手段。 一、lvm_read包安装 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务

cnjs1994的博客 2850

私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站

私家侦探如何追踪难以找到的人,掌握几个很少人知道的在线免费查询网站,搜索人名、电话号码以及地址的开源网站。

代码讲故事 6484

hdu1542/poj 1151 (线段树&离散化&求矩形面积并)

题目链接:poj1151 hdu1542 /*hdu 1542 Atlantis/poj 1151 Atlantis 题意:求矩形面积并 思路:将x离散化后建树(以区间建树),将矩形分为上下两边, 上边为入边,下边为出边,从下往上扫描 注意建树使用区间建树,即线段树的节点表示的是线段,而非端点 PS:扫描线,黑书412页 */ #include #include #include using

no pains,no gains 1199

第八届传智杯WPS智能办公能力挑战赛练习题库

本文是关于WPS Office软件操作知识的选择题汇总,内容涵盖WPS文字、表格和演示三大组件的常用功能。主要包括:云文档协同编辑、文本框插入、幻灯片打印设置、数据排序与筛选、函数应用(如SUMIF、COUNT)、动画效果设置、格式刷使用、页眉页脚设置、单元格引用类型等基础操作要点。同时涉及计算机基础概念如二进制、ROM存储器等。题目以单选和多选形式呈现,附带详细答案解析,全面检验用户对WPS办公软件的功能掌握程度和实际操作能力,适用于办公软件技能培训和水平测试。

qq_73044452的博客 1427

HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the i...

alince20008的博客 170

TC3XX - MCAL知识点(十三):IOM EB-tresos配置说明及代码浅析

输入输出监视器(IOM)驱动程序作为比较单元,检查系统外设输出的正确操作,这些输出可以作为监视功能的输入。监控功能需要通过配置IOM硬件来实现。它向SMU生成全局系统事件。IOM驱动程序初始化并控制微控制器的IOM单元。驱动程序还为用户提供初始化和设置IOM内部单元的阈值的服务。它还应该提供重置IOM内核的服务。应该提供该服务来组合单个或多个本地事件,以生成单个全局系统事件。IOM驱动程序严重依赖于初始化和配置。软硬件关系如下图缩写解释LAM逻辑分析模块ECM事件组合模块FPC。

梦想技术家 1799

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

POJ1151 HDU1542 求矩形面积并 线段树离散化+扫描线

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18498    Accepted Submission(s): 7503 Problem Description There are several ancient...

紫芝的博客 512

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板

好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解。现在来水一水博客,写一下若干年前的题目的题解。 Atlantis Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21978Accepted Submissio...

weixin_30776863的博客 131

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

并矩形覆盖的面积

************************* 优秀博客系列: http://blog.youkuaiyun.com/dooder_daodao/article/details/6334169 ************************** Poj1151/HDU1542(求并矩形覆盖的面积)分别用离散化处理,矩形切割,线段树三种方法实现. 题目链接:http://poj.org

三少GG 1720

HDU - 1542 Atlantis 面积并

HDU - 1542 Atlantis 第一次做扫描线,感觉很懵逼,思路很好理解,但代码实现完全想不到。。。 不会的可以看这:算法总结:【线段树+扫描线】&amp;矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) 用1标记下边,-1标记上边是最合理的(想想为什么,提示:下边--插入,上边--删除) 这题横坐标略大,需要离散化处理   现在假设有两个区间段:1——2——3...

没有梦想何以远行 226

一篇文章搞懂扫描线算法(线段树) HDU1542

怨念 这个专题其实不难,但是翻了一圈网上的博客,写得是云里雾里,有些一上来概念也不解释,直接就讲线段树,有些放个图直接开始糊代码的,真是佛了,打算用一篇博客把这个问题讲得非常明白。 前序知识 能看懂这篇文章需要: 线段树基础知识。 线段树染色问题基本概念。 离散化操作 目标 首先这个扫描线算法解决的是什么问题? 主要解决的是ACM中的 矩形面积问题 矩形周长问题 多边形面积问题 这篇...

小水的博客 9520

HDU 1542 Atlantis(线段树求矩形面积并)

题目链接:点击打开链接 题意:给你n个矩形, 求这n个矩形所覆盖的面积(重复覆盖算一次) 思路:我们可以考虑, 将y坐标保存并排序。 按x坐标离散化后建立线段树。 每次遇到一个矩形的下底边就将这个区间+1, 遇到上边就-1, 每次更新后累加当前x区间的长度乘以相邻两边的高度。  具体原因可以画图看看就明白了。   另外很重要的一点就是, 线段树都是维护一个点集, 但是对于边的问题就会变得很麻烦

AC_Arthur的专栏 2666

【hdu1542】线段树求矩形面积并

【hdu1542】线段树求矩形面积并 分割线内容转载自http://hzwer.com/879.html --------------------------------------------------------------------------------- 第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易...

qq_25768269的博客 238

hdu1542(矩形面积并)

链接:点击打开链接 题意 :给出n个矩形的左下角和右上角的坐标,求矩形面积的并 代码:#include #include #include #include using namespace std; const int SIZE=505; int add[SIZE<<2]; //add为区间标记,与懒惰标记类似

stay_accept的专栏 3371

矩形面积并、矩形面积交、矩形周长并(线段树、扫描线总结)

HDU 1542 [POJ 1151] Atlantis (矩形面积并) 题意: 求N<=100个矩形的面积并求N<=100个矩形的面积并分析: 离散化: 这些技巧都是老生常谈的了, 不然浮点数怎么建树, 离散化xx坐标就可以了 扫描线: 首先把矩形按yy轴分成两条边, 上边和下边, 对xx轴建树, 扫描线可以看成一根平行于xx轴的直线. 从y=0y=0开始往上扫, 下边表示要计

TaoSama's Microcosm 1万+

HDU1542线段树面积并

HDU 1542题意:给你多组数据,每组数据每行代表一个矩形的左下标和右上标;计算每组数据的面积,重叠面积也只算一次。这里采用的是线段树算法。由于题意中给出的坐标都是带小数的,先前线段树都是整型,所以就有了离散化这个词。翻阅了很多大大们对离散化扫描线的理解,最早是从http://www.cnblogs.com/scau20110726/archive/2013/03/21/2972808.html这

我是你柚子哥哥 394

poj 1151 && hdu 1542 求矩形面积并(线段树)

线段树的做法大致如下:        1输入每个矩形,标记左边1,右边0,并记录矩形的横坐标与纵坐标;        2离散化处理。将矩形的横坐标和纵左边排序;        3对纵坐标进行去重;        4建立线段树,用纵坐标重后的个数来建立线段树;

&&&思考中前行~~ 1072
上一篇: ACM计算几何中的精度问题(转)
下一篇: hdu 1255 线段树 求矩形面积的交
QZQmmmm
博客等级 码龄11年 77粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值