题意:
       给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少。

思路:

      是典型的矩形覆盖问题,只不过每个矩形上多了一个矩形洞,我的做法是吧当前的矩形分成四个小的矩形,然后用线段树的扫描线扫一遍就ok了,记得要用INT64 ,自己没注意这个问题wa了一次。


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

using namespace std;typedef struct
{__int64 l ,r ,h ,mk;
}EDGE;__int64 len[N] ,cnt[N];
EDGE edge[N*2];bool camp(EDGE a ,EDGE b)
{return a.h < b.h || a.h == b.h && a.mk > b.mk;
}void Pushup(__int64 l ,__int64 r ,__int64 t)
{if(cnt[t]) len[t] = r - l;else if(l + 1 == r) len[t] = 0;else len[t] = len[t<<1] + len[t<<1|1];
}void Update(__int64 l ,__int64 r ,__int64 t ,__int64 a ,__int64 b ,__int64 c)
{//printf("%d %d %d\n" ,l ,r ,t);
   if(l == a && r == b){cnt[t] += c;Pushup(l ,r ,t);return;}__int64 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);
}__int64 abss(__int64 x)
{return x < 0 ? -x : x;
}int main ()
{__int64 i ,j ,n ,x1 ,x2 ,x3 ,x4 ,y1 ,y2 ,y3 ,y4 ,id;__int64 xx1 ,xx2 ,yy1 ,yy2;while(~scanf("%I64d" ,&n) && n){for(id = 0 ,i = 1 ;i <= n ;i ++){scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d %I64d" ,&x1 ,&y1 ,&x2 ,&y2 ,&x3 ,&y3 ,&x4 ,&y4);x1 ++ ,y1 ++ ,x2 ++ ,y2 ++ ,x3 ++ ,y3 ++ ,x4 ++ ,y4 ++;// x1 y2 x2 y4
         xx1 = x1 ,xx2 = x2 ,yy1 = y2 ,yy2 = y4;if(abss(xx1 - xx2) && abss(yy1 - yy2)){edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1;edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;}// x1 y3 x2 y1
         xx1 = x1 ,xx2 = x2 ,yy1 = y3 ,yy2 = y1;if(abss(xx1 - xx2) && abss(yy1 - yy2)){edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1;edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;}// x1 y4 x3 y3
         xx1 = x1 ,xx2 = x3 ,yy1 = y4 ,yy2 = y3;if(abss(xx1 - xx2) && abss(yy1 - yy2)){edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1;edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;}// x4 y4 x2 y3
         xx1 = x4 ,xx2 = x2 ,yy1 = y4 ,yy2 = y3;if(abss(xx1 - xx2) && abss(yy1 - yy2)){edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1;edge[++id].l = xx1;edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;}  }sort(edge + 1 ,edge + id + 1 ,camp);__int64 Ans = 0;memset(len ,0 ,sizeof(len));memset(cnt ,0 ,sizeof(cnt));edge[0].h = edge[1].h;for(i = 1 ;i <= id ;i ++){Ans += len[1] * (edge[i].h - edge[i-1].h);Update(1 ,50001,1 ,edge[i].l ,edge[i].r ,edge[i].mk);}printf("%I64d\n" ,Ans);}return 0;
}

     

hdu 3265 线段树扫描线(拆分矩形)相关推荐

  1. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  2. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  3. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  4. POJ1151(线段树+扫描线求矩形面积并)

    题目:http://poj.org/problem?id=1151 #include <iostream> #include <string.h> #include <a ...

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

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

  6. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  7. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  8. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 732  Solved: ...

  9. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

最新文章

  1. 【面试虐菜】—— 常用SQL语句
  2. 【ZooKeeper Notes 30】ZooKeeper与Diamond有什么不一样
  3. 数据处理踩过的坑(不断更新):
  4. 2020 华为杯 数模 B题 数据挖掘
  5. Runtime消息动态解析与转发流程
  6. C++中多态的基本概念以及虚表的基本概念
  7. 证券计算机行业研究,20210630-首创证券-计算机行业深度报告:物联网,研究框架.pdf...
  8. 对于.net开发的程序谷歌输入法输入优于搜狗
  9. 2017AAAI召开 百度王海峰揭秘百度自然语音处理技术
  10. SAS用proc means和proc univariate求数据的样本均值、中位数、四分位数、样本方差、极差、变异系数、二阶、三阶和四阶中心矩、偏度、峰度、标准差和对数据进行正态性检验
  11. 怎样批量替换Word中的文字?这一招Word文字替换技巧你会吗
  12. 剁手节致敬!听当年的老人讲述阿帕网(互联网前身)诞生的故事
  13. 应用计算机怎么弹ink,ink是什么文件,手把手教你怎么打开ink文件
  14. 在python程序中,#后面的语句是表示啥意思
  15. 昆石VOS3000/VOS2009 2.1.6.00 操作指南相关
  16. Element学习使用
  17. c语言循环次数计算多重循环,C语言 第六章 多重循环练习
  18. modbus slave和modbus poll使用说明
  19. 无U盘win10安装Linux-Ubuntu系统
  20. python 基金净值_用Python抓取天天基金网基金历史净值数据

热门文章

  1. 《重构,改善既有代码的设计》读书笔记
  2. Android上webview界面切换动画效果
  3. 探索Android中的Parcel机制(上)
  4. [JAVAWEB实战篇]---Hibernate实现级联删除
  5. 动态链接库的编写与调用
  6. UVa 389 Basically Speaking
  7. mysql五大引擎之间的区别和优劣之分
  8. js数组中foEach和map的用法详解 jq中的$.each和$.map
  9. (转)CSS样式表继承详解
  10. java集合框架(Framework)的性能