题意:

      给你n个矩形,然后问你这n个矩形所组成的画面中被覆盖至少两次的面积有多大。

思路:

      和1542差距并不是很大,大体上还是离散化+线段树扫面线,不同的地方就是这个题目要求覆盖至少两次,那么假如l1:覆盖一次的区间长度,l2:覆盖至少两次的区间长度, l3:整个区间的长度,并且满足 l1 + l2 = l3,cnt为区间覆盖次数,那么在更新pushup的时候

 (1)cnt >= 2 那么l2 = l3 ,l1 = 0

 (2)cnt == 1 那么l2 = 左边l1 + 右边l1 + 左边l2 + 右边l2,l1 = l3 - l2

 (3)cnt == 0 那么如果是叶子了l1 = l2 = 0,否则正常更新l1=l1左+l1右,l2=l2左+l2右.


#include<stdio.h>
#include<string.h>
#include<algorithm> #define lson l ,mid ,t << 1
#define rson mid ,r ,t << 1 | 1
#define N_node 10000

using namespace
std; typedef struct
{
double
l ,r ,h;
int
mk;
}
EDGE; EDGE edge[N_node];
double
len1[N_node] ,len2[N_node];
int
cnt[N_node];
double
tmp[N_node] ,num[N_node]; bool camp(EDGE a ,EDGE b)
{
return
a.h < b.h;
} void
Pushup(int l ,int r ,int t)
{
if(
cnt[t] >= 2)
{

len2[t] = num[r] - num[l];
len1[t] = 0;
}
else if(
cnt[t] == 1)
{

len2[t] = len2[t<<1] + len2[t<<1|1] + len1[t<<1] + len1[t<<1|1];
len1[t] = num[r] - num[l] - len2[t];
}
else
{
if(
l + 1 == r)
{

len2[t] = len1[t] = 0;
}
else
{

len2[t] = len2[t<<1] + len2[t<<1|1];
len1[t] = len1[t<<1] + len1[t<<1|1];
}
}
} void
Update(int l ,int r ,int t ,int a ,int b ,int c)
{
if(
a == l && b == r)
{

cnt[t] += c;
Pushup(l ,r ,t);
return;
}
int
mid = (l + r) >> 1;
if(
b <= mid) Update(lson ,a ,b ,c);
else if(
a >= mid) Update(rson ,a ,b ,c);
else
{

Update(lson ,a ,mid ,c);
Update(rson ,mid ,b ,c);
}

Pushup(l ,r ,t);
} int
search_2(int id ,double now)
{
int
low = 1 ,up = id ,mid ,ans;
while(
low <= up)
{

mid = (low + up) >> 1;
if(
now <= num[mid])
{

ans = mid;
up = mid - 1;
}
else
low = mid + 1;
}
return
ans;
} int main ()
{
int
t ,i ,id ,n;
double
x1 ,x2 ,y1 ,y2 ,sum;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d" ,&n);
for(
id = 0 ,i = 1 ;i <= n ;i ++)
{

scanf("%lf %lf %lf %lf" ,&x1 ,&y1 ,&x2 ,&y2);
edge[++id].l = x1;
edge[id].r = x2 ,edge[id].h = y1 ,edge[id].mk = 1;
tmp[id] = x1; edge[++id].l = x1;
edge[id].r = x2 ,edge[id].h = y2 ,edge[id].mk = -1;
tmp[id] = x2;
}

sort(tmp + 1 ,tmp + id + 1);
sort(edge + 1 ,edge + id + 1 ,camp);
for(
id = 0 ,i = 1 ;i <= n * 2 ;i ++)
if(
i == 1 || tmp[i] != tmp[i-1])
num[++id] = tmp[i];
memset(cnt ,0 ,sizeof(cnt));
memset(len1 ,0 ,sizeof(len1));
memset(len2 ,0 ,sizeof(len2));
edge[0].h = edge[1].h;
for(
sum = 0 ,i = 1 ;i <= n * 2 ;i ++)
{

sum += len2[1] * (edge[i].h - edge[i-1].h);
int
l = search_2(id ,edge[i].l);
int
r = search_2(id ,edge[i].r);
Update(1 ,id ,1 ,l ,r ,edge[i].mk);
}

printf("%.2lf\n" ,sum);
}
return
0;
}

hdu1255 扫描线,矩形重叠面积(两次以上)的更多相关文章

  1. HDU1255 扫描线 矩形交面积 离散化

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. hdu2056 矩形重叠面积(水题)

    题意:       给你两个矩形,问你他们的重叠面积是多少. 思路:      这两个矩形是平行x和y轴的,所以水题,不解释. #include<stdio.h> typedef stru ...

  3. Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)

    Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box) function DecideOberlap(BBox_x1, BBox_y1, BBox_x2, ...

  4. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  5. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  6. D重叠面积

    Description zjahstu是个很厚道的ACMer,O(∩_∩)O~..特为大家准备水题一道.. 题目很简单,两个矩形,告诉你矩形1,矩形2的面积和他们的总面积,请你求两矩形重叠部分的面积. ...

  7. [LeetCode] Rectangle Overlap 矩形重叠

    A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...

  8. [Swift]LeetCode836. 矩形重叠 | Rectangle Overlap

    A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...

  9. LeetCode 836. 矩形重叠

    题目链接:https://leetcode-cn.com/problems/rectangle-overlap/ 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左 ...

随机推荐

  1. EurekaServer源码分析

    Eureka Server功能 接受服务注册 接受服务心跳 服务剔除 服务下线 集群同步 获取注册表中服务实例信息 需要注意的是,Eureka Server同时也是一个Eureka Client,在不 ...

  2. IT求职 非技术面试题汇总

    原文链接:https://blog.csdn.net/weixin_40845165/article/details/89852397 说明:原文是浏览网页时无意间看到的.扫了一眼,总结得还不错,感谢 ...

  3. 白嫖微软Azure12个月服务器

    前言 Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国 ...

  4. Android之Parcelable解析

    http://www.cnblogs.com/abinxm/archive/2011/11/16/2250949.html http://www.cnblogs.com/renqingping/arc ...

  5. 1.认识numpy的数组

    认识ndarray --ndarray:用于存储单一数据类型的多维数组 ndarray基础属性的认识 import numpy as np #将numpy简写为np方便调用 1.通过以下实例来认识ar ...

  6. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  7. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

  8. C语言可变参函数分析

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  9. Hadoop集群--linux虚拟机Hadoop安装与配置、克隆虚拟机

    Hadoop集群 第四章 Hadoop安装与配置.克隆虚拟机 一.Hadoop安装与配置 1.将hadoop安装包通过Xftp传输到虚拟机的/software目录下 2.进入/software目录下, ...

  10. 国产mcu理论数据评估工作记录

    目录 前言 简要工作记录 前言 时间:20210315 主要记录这两天对国内各IC厂商的 MCU 了解记录. 大环境,ST 厂商 MCU 疯狂涨价,国内 MCU 也越来越完善,还便宜.同时,全球缺晶圆 ...