正题

题目链接:http://poj.org/problem?id=1151


题目大意

有n个矩形,求所以矩形的覆盖面积。


解题思路

我们用离散化一个坐标,然后每次用线段树维护这个宽度内覆盖高度和,然后定义左上的点是加入,右下的点是弹出。


code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 110
using namespace std;
struct treenode{int l,r;double mark,val;
}t[N*8];
struct node{double x1,x2,y;int flag;
}a[N*2];
int n,tot,l;
double x[N*2],ans;
void build(int k,int l,int r)
{t[k].l=l;t[k].r=r;if(l==r) return;int mid=(l+r)>>1;build(k*2,l,mid);build(k*2+1,mid+1,r);
}
void change(int k,int l,int r,int num)
{if(t[k].l==l&&t[k].r==r){t[k].mark+=num;//标记了多少次if(t[k].mark)t[k].val=x[t[k].r+1]-x[t[k].l];//如果标记就直接返回答案else if(l==r) t[k].val=0;else t[k].val=t[k*2].val+t[k*2+1].val;//合并下面return;}int mid=(t[k].l+t[k].r)>>1;if(r<=mid) change(k*2,l,r,num);else if(l>mid) change(k*2+1,l,r,num);else change(k*2,l,mid,num),change(k*2+1,mid+1,r,num);if(t[k].mark)t[k].val=x[t[k].r+1]-x[t[k].l];else t[k].val=t[k*2].val+t[k*2+1].val;
}
bool cmp(node x,node y)
{return x.y<y.y;}
int main()
{while(scanf("%d",&n)&&n){memset(t,0,sizeof(t));ans=0;int cnt=0,l=0;double x1,y1,x2,y2;for(int i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);x[++l]=x1;x[++l]=x2;a[++cnt]=(node){x1,x2,y1,1};a[++cnt]=(node){x1,x2,y2,-1};}stable_sort(x+1,x+l+1);l=unique(x+1,x+l+1)-(x+1);//离散化build(1,1,l);//建树stable_sort(a+1,a+1+cnt,cmp);for(int i=1;i<cnt;i++){int xx=lower_bound(x+1,x+l,a[i].x1)-x;int yy=lower_bound(x+1,x+l,a[i].x2)-x-1;//找到位置change(1,xx,yy,a[i].flag);//修改ans+=t[1].val*(a[i+1].y-a[i].y);//计算该宽度答案}printf("Test case #%d\nTotal explored area: %.2f\n\n",++tot,ans);}
}

POJ1151-Atlantis【线段树,扫描线,离散化】相关推荐

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

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

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

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

  3. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

  4. HDU - 1542 Atlantis(线段树+扫描线)

    题目链接:点击查看 题目大意:给出n个矩形的左下角坐标和右上角坐标,求出其总面积,注意,矩形会重叠,重叠部分只计算一次 题目分析:如果暴力做需要考虑容斥原理,两两矩形组合判断是否重合,十分麻烦而且时间 ...

  5. 线段树 + 扫描线 + 离散化:亚特兰蒂斯

    题目链接:https://www.acwing.com/problem/content/description/249/ 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包 ...

  6. POJ 1151 Atlantis 线段树+扫描线

    解题思路: 先将y轴进行离散化.n个矩形的2n个横边纵坐标共构成最多2n-1个区间的边界,对这些区间编号,建立起线段树. x轴记录左边和右边,左边时是矩形面积增加,覆盖层数增加边,右边是形面积减少,覆 ...

  7. 610D - Vika and Segments(线段树+扫描线+离散化)

    扫描线:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 看图,图中的数字是横坐标离散后对应的下标,计算时左端点不 ...

  8. POJ2482-Stars in Your Window【线段树,扫描线,离散化】

    正题 题目链接:http://poj.org/problem?id=2482 题目大意 有若干个点,每个点有不同的权值,求用一个h*w的矩阵扩起来的权值最大. 解题思路 先离散化一个坐标,然后另一个坐 ...

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

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

最新文章

  1. 基于RT-Thread开发智能视觉组智能车-乐山师范学院
  2. 循环中 动态参数 传div 层_【转载】黄学杰等:铌元素在锂离子电池中的应用
  3. 现代信用卡管理(二)
  4. mybatis plug 只查id_mybatis-plugin的几种常用的方法
  5. java系统界面找不到符号,找不到符号,java找不到符号
  6. 【TensorFlow-windows】学习笔记八——简化网络书写
  7. CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波
  8. android studio gradle 学习,学习Android Studio里的Gradle
  9. 10 张图带你深入理解Docker容器和镜像
  10. ipad上写代码???阿里云+vscode-server助你一臂之力
  11. 多进程统计策略盈亏分布——从零到实盘12
  12. 云大使成长精华指引(全)
  13. Java原始数据类型
  14. 意外险、医疗险、重疾险、寿险的主要保障功能和提示
  15. Markdown表格中换行、合并单元格
  16. python安装pillow报错
  17. 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...
  18. Linux 创建用户和添加操作权限
  19. 24岁博士毕业、47岁当选院士的他,正式担任上海交通大学校长!
  20. 会计学原理学习笔记——第三章——账户与复式记账(3.5生产准备业务核算——费用发生业务核算)

热门文章

  1. java线程带来的异常,java多线程练习之捕获子线程异常例子
  2. 数据结构——二叉树的层次遍历
  3. [SpringBoot2]web场景_SpringBoot2_SpringMVC自动配置概览
  4. 《C++ Primer》7.5.1节练习
  5. 数据结构与算法--重建二叉树
  6. 自动生成sqlserver增删改成_如何批量生成证书证件-可变条码-可变图片-可变数据-快速教程...
  7. 堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2-icoding-void init_min_heap(PMinHeap pq, int
  8. 数据结构---顺序查找和二分查找
  9. c语言树写入文件,如何安全地实现文件树遍历(C语言)
  10. 二叉树先序,中序,后序,层次遍历(数据结构)