HDU - 1255 覆盖的面积 【线段树求相交面积】

HDU---1255:覆盖的面积【矩形面积并】 题意: 给出若干个与轴平行的矩形,求被覆盖了2次及以上区域的面积 分析: 简述扫描线算法: 下图3个矩形共有6条扫描线,我们只需要计算出相邻两条扫描线之间的被覆盖的面积相加即可得到矩形的面积并,实现如下: (1)对图中的每条横边(竖边也行)按它的高度从小到大排序 (2)从下到上依次扫描每条横边(即扫描线),计算当前扫描线覆盖的总长度,乘上与上一条扫描线之间的高度差即得到它们之间的被覆... 阅读详情

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255

这题的方法在之前的博客有比较详细的描述,这里把需要注意的重点说一下就行了。

https://blog.youkuaiyun.com/godleaf/article/details/86608855

如果题目只是问覆盖至少一次的话,代码基本上不用变,只需要把ans累加的公式改一下就行了,\Delta X就是两个相邻的垂直线距离,y就是被覆盖的y轴长度。

但是题目要求的是至少2次,那么代码不是说把 cover > 0 改成 cover > 1就行了。 之前的博客有说到cover标记的可信问题。如果cover > 0,那么当前区间就一定能整段取, == 0则不能保证,需要访问左右区间才能知道被覆盖1次的区间长度有多少。如果求覆盖至少2次,那么cover > 1就是可信的,能够整段取,== 0 的情况也能通过左右区间得到覆盖至少2次的区间长度,但是 == 1还存在一种情况,如果当前cover == 1,而子孙节点有 == 1的情况,那么这个子孙节点的区间也是可以取的,但是我们记录了覆盖至少2次的区间长度,当前节点并不知道自己的子孙节点被覆盖1次的区间有多少。讲到这里大概都能猜出怎么做了吧。就是在该线段树扩展一个记录覆盖1次的区间长度,这样就能解决问题了。

在pushup更新区间长度的时候一定要注意不要重复了。当cover == 1 的时候,被覆盖至少两次的长度就是被覆盖2次的长度+被覆盖1次的长度,那么当前区间被覆盖1次的长度就不是一整段区间了,因为有一部分已经加到被覆盖2次的区间长度里面了,所以要除去这些加到被覆盖2次的区间长度。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <set>

using namespace std;

#define lc (cur<<1)
#define rc ((cur<<1)|1)

const int Maxn = 1e3+10;
const int mod = 10007;

typedef long long ll;

struct tree {
    int cover;
    double len1, len2;
} seg[Maxn<<5];

struct Edge {
    int l ,r, val;
    double od;
    bool operator < (const Edge &a1) const {
        return od < a1.od;
    }
} edge[Maxn<<1];

double Hash[Maxn<<2], tmp[Maxn<<2];
int L, R, op;

void pushup(int cur, int l, int r) {
    if(seg[cur].cover > 1) {
        seg[cur].len2 = Hash[r]-Hash[l-1];
        seg[cur].len1 = 0;
    }

   else if(seg[cur].cover == 1) {
        if(l == r) {
            seg[cur].len2 = 0;
            seg[cur].len1 = Hash[r]-Hash[l-1];
        }
        else {
            seg[cur].len2 = seg[lc].len1+seg[rc].len1+seg[lc].len2+seg[rc].len2;
            seg[cur].len1 = Hash[r]-Hash[l-1]-seg[cur].len2;
        }
    }
    else if(seg[cur].cover == 0) {
        if(l == r) seg[cur].len1 = seg[cur].len2 = 0;
        else {
            seg[cur].len1 = seg[lc].len1+seg[rc].len1;
            seg[cur].len2 = seg[lc].len2+seg[rc].len2;
        }
    }
}

void updata(int cur, int l, int r) {
    if(L <= l && r <= R) {
        seg[cur].cover += op;
        pushup(cur, l, r);
        return;
    }

    int mid = (l+r)>>1;

    if(L <= mid) updata(lc, l, mid);
    if(mid+1 <= R) updata(rc, mid+1, r);

    pushup(cur, l, r);
}

int main(void)
{
    int T, N;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &N);
        for(int i = 0; i < 4*N; ++i) {
            scanf("%lf", &tmp[i]);
            Hash[i] = tmp[i];
        }

        sort(Hash, Hash+4*N);
        int len = unique(Hash, Hash+4*N)-Hash, m = 0;

        for(int i = 0; i < N; ++i) {
            int l = lower_bound(Hash, Hash+len, tmp[(i<<2)+1])-Hash+1;
            int r = lower_bound(Hash, Hash+len, tmp[(i<<2)+3])-Hash;

            edge[++m].l = l; edge[m].r = r; edge[m].od = tmp[(i<<2)];
            edge[m].val = 1;
            edge[++m].l = l; edge[m].r = r; edge[m].od = tmp[(i<<2)+2];
            edge[m].val = -1;
        }

        sort(edge+1, edge+m+1);

        for(int i = 0; i <= 4*len; ++i) seg[i].cover = seg[i].len1 = seg[i].len2 = 0;

        double ans = 0;
        for(int i = 1; i < m; ++i) {
            L = edge[i].l; R = edge[i].r;
            op = edge[i].val;
            updata(1, 1, len-1);
            ans += (seg[1].len2*(edge[i+1].od-edge[i].od));
        }
        printf("%.2f\n", ans);
    }
    return 0;
}

 

C#与Lua交互原理 以前每一次研究一些新知识并且有所收获的时候,都想写一篇博客来分享这种自己的收获。 一直没有写主要是因为自己水平太菜了,怕写出来贻笑大方,最近想通了,想写就写下来,就算对别人毫无用处,还可以自己没事翻翻,省得自己都忘了。当然如果能对你有一丝丝的帮助,那真是再好不过了 。本文将针对C#与Lua的调用原理阐述一些个人的心得 。 Lua开发环境搭建 有关于VS &amp... 阅读详情

相关推荐

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式,

weixin_51692487的博客 1525

hdu1255——矩形面积并(两次覆盖以上)

题目链接:https://vjudge.net/problem/HDU-1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一...

mumei的博客 761

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1007

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

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

龙卡的博客 827

从AMCL到SLAM Toolbox:在Nav2中实现高精度纯定位的实践指南

本文详细介绍了从AMCL迁移到SLAM Toolbox纯定位模式的实践指南,帮助开发者在Nav2中实现高精度定位。通过对比AMCL与SLAM Toolbox的性能差异,提供环境配置、参数调优、Nav2集成等关键步骤,显著提升机器人在动态环境中的定位精度和重定位效率。

weixin_29292535的博客 148

量子通信:初识量子城域网

对量子城域网的概念、作用、拓扑、建设内容等进行了较为全面的初步介绍。

量子领域相关话题 3348

HDU1255-覆盖的面积(扫描线求面积并)

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

swust5120160705的博客 337

嘉立创EDA vs Altium Designer:新手如何选择?从界面到实战全对比

本文全面对比了嘉立创EDA与Altium Designer(AD)两大PCB设计工具,从设计哲学、界面交互、封装库管理、设计规则引擎、协作功能到成本生态六大维度进行深入分析。嘉立创EDA以极简设计和云端协作为特色,适合学生和创客快速上手;而AD则凭借专业级精准控制,成为高端电子设计的行业标准。通过实战案例和详细对比表格,帮助新手根据项目需求选择合适的EDA工具。

weixin_30296405的博客 721

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:中文题,很清楚 思路:上面有一个求所有覆盖面积的题,我们只用新加一个参数,表示覆盖的区间是两次重复的即可。要怎么表示呢? 经过简单的分析,我们得出可以有这几种情况: 1.如果这个区间没有被覆盖,不用去管他。 2.如果一个区间被覆盖了两次及以上,那么这个区间的有效长度就是整个区...

永远鲜红の幼月的博客 387

【天线与电波传播】电波传播部分 第7章 电波传播的基础知识3

菲涅尔区与菲涅尔带的基本知识

Chen59_2328的博客 1601

基于simulink的软开关技术的三相逆变器仿真

三相逆变器中的软开关技术(Soft Switching Techniques)旨在减少开关损耗,提高效率,并降低电磁干扰(EMI)。实现软开关通常涉及使用谐振电路或准谐振电路来确保开关器件在零电压(Zero Voltage Switching, ZVS)或零电流(Zero Current Switching, ZCS)条件下进行切换。下面将详细介绍如何在Simulink中进行基于软开关技术的三相逆变器仿真设计。

xiaoheshang_123的博客 162

【HDU1255】覆盖的面积【线段树】【矩形面积交】

【题目链接】 再记录一个rep数组,表示当前区间至少被覆盖2次的长度。 /* Pigonometry */ #include #include #include using namespace std; typedef double DB; const int maxn = 1005; int n, m, tot, tr[maxn << 4]; DB sum[maxn <<

BraketBN 481

Far planner 代码系列(35)动态障碍物预处理_激光雷达部分

主要讲解动态障碍物在激光雷达部分的剔除机制

博客 1059

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

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

ccsu_deer 503

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

线段树扫描线求面积交和并、周长 [POJ 1177] [HDU 1255] [HDU 1542]

今天来谈一谈线段树扫描线求相关的二维平面上多个矩形的面积之交、面积之并、周长等相关问题。首先,有几道模板题目:http://poj.org/problem?id=1177 [求周长]http://acm.hdu.edu.cn/showproblem.php?pid=1255 [求面积之交]http://acm.hdu.edu.cn/showproblem.php?pid=1542 [求面积之并]这...

chen_YongZu的博客 460

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

线段树扫描线(2---算矩形的相交面积)

HDU-1255 首先感谢一下 Titanium:http://acm.hdu.edu.cn/showproblem.php?pid=1255 从他的博客中得到了思路 怎么计算出重复的面积。 遇到这个求相交矩形的面积的时候,我第一反应就是将cnt标记下推,然后每次都将标记下推, 最后根据cnt的值来模仿1中求面积的方式来求,然后实现起来很复杂,并且估计会超时,所以就百度寻求了一波帮...

dengpangbu3703的博客 208

扫描线,线段树,HDU 1542 HDU 4419 HDU 1255 HDU 1828

我是看这个博客看懂的https://www.cnblogs.com/whywhy/p/4214353.html; 扫描线就是线段树; 先看看最简单的应用(下面我觉得讲得不好,如果不想看直接看下面的注意或者模板吧) 计算图示图形的面积,我们可以上下扫描,也可以左右扫描,图示分成的三部分就是,左右扫描,把他每一个矩形的边都记录下来,并标记是左右边或者上下边关系。左右扫描的时候,线段树维护...

KXL5180的博客 291

扫描线

算法模型分析: ·ACM中,扫描线被用来处理矩形相交后面积问题,十分易懂,代码也逻辑性明了,容易懂,类题代码类似,常与线段树搭配使用,时间复杂度低,但如果无法灵活处理线段树,那么学起来也比较艰辛! ·在比赛或者生活中,我们会经常遇到多个矩形叠放后,求并图形的面积,这是个非常明了的问题,一般最初级的思维:暴力求解---矩形切割 (参考: 薛矛 IOI2004国家集训队论文  《解决动态统计问题...

long1的博客 8393

HDU 1255——覆盖的面积(矩形面积交:线段树+扫描线)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意:  给出N(N&lt;=1000)个矩形,求至少被两个矩形的所覆盖的面积和。 思路: 和上篇博客 链接 求多个矩形面积交的思路很相像,那个是维护当前有效宽求面积并,这里只需将cnt[i]&gt;=2的看做有效宽(因为cnt记录的是扫描线的覆盖情况,当某个区间被下底边至少覆盖了...

QuincyTan的博客 472

HDU 1255 覆盖的面积

矩形面积交。跟面积并差不多,只不过要记录两种信息,就是覆盖的次数,每次求出覆盖超过两次的线段的长度,乘以高,累加即可。pushup里面需要注意一下,当覆盖次数超过1和等于0时都正常处理,但当覆盖次数等于1时,是指当前区间的覆盖次数,考虑到他的子区间可能也会有覆盖过,所以所有之前覆盖过的子区间,现在都是又多被覆盖了1次。即sum[rt][1] = sum[rt #pragma comment

DotACM 792

hdu 1255 覆盖的面积

给出 n 个矩形,求它们相交部分的总面积

iTom's blog 325

HDU 1255 覆盖的面积(矩形交的面积)

题目链接: HDU 1255 覆盖的面积//1832K 280MS #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #define lson(x) (x<<1) #define rson(x) ((x<<1)|1) us

ramay7 478

hdu 1255 覆盖的面积(线段树+扫描线——面积交)

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

Darkarts 646

HDU 1255

题目大意:求矩形相交部分面积和#include #include using namespace std; #define N 2001 struct node {     int l,r,cover;     double one_len,more_len;     int getmid(){         return (l+r)>>1;     } }p[3*N]; struct Line {     double l,r,h;     int flag; }L[N]

ME4546的专栏 1617

HDU 1255(线段树优化扫描线——矩形交集)

~by Wjvje 2019-5-3 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目描述: 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)Memory Limit: 65536/32768 K (...

又菜又爱玩 493

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

自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了 题意:给你一些矩阵,求出矩阵的面积并首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做)。 然后我们可以想一下怎样才能使面积相交呢?我们可以注意到如果矩阵入线出现超过一次就一定有面积相交,所以我们记录入线与出线,再排序y轴,从小到大(注意y轴等大时先进后出)扫描线段。 记录:总长度,当前一整段一起覆盖一次的长度,

专注如一的博客 332
上一篇: HDU 1828 Picture 【线段树+离散化+扫描线】
下一篇: HDU 3642 Get The Treasury 【线段树+扫描线(相交体积)】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值