hdu1255 扫描线,矩形重叠面积(两次以上)
题意:
给你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 扫描线,矩形重叠面积(两次以上)的更多相关文章
- HDU1255 扫描线 矩形交面积 离散化
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu2056 矩形重叠面积(水题)
题意: 给你两个矩形,问你他们的重叠面积是多少. 思路: 这两个矩形是平行x和y轴的,所以水题,不解释. #include<stdio.h> typedef stru ...
- Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)
Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box) function DecideOberlap(BBox_x1, BBox_y1, BBox_x2, ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- D重叠面积
Description zjahstu是个很厚道的ACMer,O(∩_∩)O~..特为大家准备水题一道.. 题目很简单,两个矩形,告诉你矩形1,矩形2的面积和他们的总面积,请你求两矩形重叠部分的面积. ...
- [LeetCode] Rectangle Overlap 矩形重叠
A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...
- [Swift]LeetCode836. 矩形重叠 | Rectangle Overlap
A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bot ...
- LeetCode 836. 矩形重叠
题目链接:https://leetcode-cn.com/problems/rectangle-overlap/ 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左 ...
随机推荐
- 【转载】Android异步消息处理机制详解及源码分析
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- Python 第三方登录 实现QQ 微信 微博 登录
本人写的AgentLogin,能快速返回QQ.微信.微博第三方用户名信息,主要用于快速登录 用 pip命令安装 pip install AgentLogin 用法 : 导入这个包 from Agent ...
- CVE-2020-1938 -Tomcat-AJP任意文件读取/包含
为什么这个漏洞被称作 Ghostcat(幽灵猫)? 这个漏洞影响全版本默认配置下的 Tomcat(在我们发现此漏洞的时候,确认其影响 Tomcat 9/8/7/6 全版本,而年代过于久远的更早的版本未 ...
- Linux less命令查看文件常用查询方法
g 跳到文件开头 G 跳到文件结尾 / 往下搜索字符 ? 网上搜索字符 n 执行上一个搜索(/或者?的搜索),例如上一个搜索是使用/搜索的,则继续使用/搜索,即往下搜索结果 N 反向执行上一个搜索(/ ...
- 2018.12-2019.1 TO-DO LIST
AC自动机 P3808 [模板]AC自动机(简单版)(完成时间:2018.12.06) P3796 [模板]AC自动机(加强版)(完成时间:2018.12.06) P2444 [POI2000]病毒( ...
- python 查看模块中的方法
way 1.help() way 2.dir() # dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表: way 3. 使用inspect模块, inspect.getmembe ...
- 【Linux学习笔记1】-centos6.9部署django
一,centos6.9部署django 部署套件:centos6.9+nginx+mysql+uwsgi+python3+django 首先还是要明白这几个部分之间的关系(自己也是初学者,希望 ...
- SSM 电影后台管理项目
SSM 电影后台管理项目 概述 通过对数据库中一张表的CRUD,将相应的操作结果渲染到页面上. 笔者通过这篇博客还原了项目(当然有一些隐藏的坑),然后将该项目上传到了Github.Gitee,在末尾会 ...
- java例题_16 九九乘法表
1 /*题目:输出 9*9 口诀. 2 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列. 3 */ 4 5 /*分析 6 * 用两侧for循环,外层循环还要控制换行 7 * 换行时 ...
- k8s:py项目发布完整流程
k8s:py项目发布流程 1. 编写Dockerfile # cat Dockerfile FROM python:3.6-slim USER root RUN apt-get update & ...