Atlantis poj1151 线段树扫描线

题意

题目给了n个矩形,每个矩形给了左下角右上角的坐标,矩形可能会重叠,求的是矩形最后的面积。

题解思路

这个是我线段树扫描线的第一题,听了学长的讲解,仔细研读了学长的代码,也算初步入门。

这里我们竖着的扫描线,从左到右来进行扫描的。

线段树这里端点代表的是一个区间

这里的y范围比较大,所以咱们需要离散化。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define mid ((tre[rt].l+tre[rt].r)>>1)
#define ls (rt<<1)
#define rs (rt<<1|1)
using namespace std;
const int maxn=1e2+7;
struct node{ //四元组double x, y1, y2;int k; //左边的边k是1, 右边的k为-1bool friend operator < (node a, node b){return a.x < b.x;}
}a[maxn<<1];struct tree{int l, r, cnt; //cnt记录区间被标记的次数double len;
}tre[maxn<<3];map<double, int> mp;
double raw[maxn<<1];
int n,num;void build(int rt, int l, int r)
{tre[rt].l=l;tre[rt].r=r;tre[rt].len=tre[rt].cnt=0;if(l==r) return ;build(ls, l, mid);build(rs, mid+1, r);
}void change(int rt, int l, int r, int k)
{if(l <= tre[rt].l && tre[rt].r <= r){tre[rt].cnt+=k;if(tre[rt].cnt>0){tre[rt].len=raw[tre[rt].r+1] - raw[tre[rt].l];  }   else if(tre[rt].l==tre[rt].r) //到达端点了 {tre[rt].len=0;}else tre[rt].len=tre[ls].len+tre[rs].len;return ;} if(l <= mid) change(ls, l, r, k);if(r > mid) change(rs, l, r, k);tre[rt].len = tre[rt].cnt > 0 ? raw[tre[rt].r+1] - raw[tre[rt].l] : tre[ls].len+tre[rs].len;
}int main()
{while(scanf("%d", &n) && n){int cnt;double x1, y1, x2, y2;for(int i=1; i<=n; i++){cnt=i<<1;scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);a[cnt-1].x=x1; a[cnt-1].y1=y1; a[cnt-1].y2=y2; a[cnt-1].k=1;a[cnt].x=x2; a[cnt].y1=y1; a[cnt].y2=y2; a[cnt].k=-1;raw[cnt-1]=y1; raw[cnt]=y2;}n<<=1;sort(raw+1, raw+1+n);int m=unique(raw+1, raw+n+1)-(raw+1);for(int i=1; i<=m; i++){mp[raw[i]]=i;}sort(a+1, a+n+1);build(1, 1, m-1); //这里线段树的点记录的区域,因为有m个y,所以就相当于m-1个区域double ans=0;for(int i=1; i<n; i++) //只需要处理到倒数第二个点即可 {int l=mp[a[i].y1], r=mp[a[i].y2]-1;change(1, l, r, a[i].k);ans += tre[1].len*(a[i+1].x - a[i].x);} printf("Test case #%d\nTotal explored area: %.2f\n\n", ++num, ans); }return 0;
}

转载于:https://www.cnblogs.com/alking1001/p/11383960.html

Atlantis poj1151 线段树扫描线相关推荐

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

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

  2. POJ1151 Atlantis(线段树,扫描线,离散化,矩形面积并)

    题目: Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23220 Accepted: 8657 Descrip ...

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

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

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

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

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

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

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

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

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

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

  8. POJ_1151 Atlantis(线段树)

    /*线段树扫描线问题,感觉可以作为这类问题的模板.问过师兄以后才过的... 按y轴建线段树.*/ struct node{int l, r, c; //c表示被覆盖的情况,不为0表示被覆盖 doubl ...

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

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

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

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

最新文章

  1. 如何搭建高可用Redis服务
  2. Static与函数指针 转
  3. svn提示out of date的解决方法
  4. Ubuntu16.04+caffe+digits安装配置
  5. 4月5G手机出货量出炉:5G未成主流,你换机了吗?
  6. TensorFlow的基础概念04
  7. win10系统可禁用的服务器,Win10系统SysMain服务是什么?Win10系统SysMain能不能禁用?...
  8. 判断数组是否为某二叉搜索树的后序遍历
  9. 【实习周记】ArrayMap源码分析
  10. 查询中接受的主体参数
  11. SOPC之占空比控制LED(小梅哥AC620)
  12. 深度学习机器人交易_使用深度学习创建股票交易机器人
  13. 高考2021北京录取成绩查询,2021北京地区高考成绩排名查询,北京高考各高中成绩喜报榜单...
  14. QT程序退出后托盘图标不消失问题
  15. 李兴华内部JAVA培训视频 (难找啊)
  16. App/QoE-Based Congestion control
  17. [Vue warn]: Duplicate keys detected: ‘user‘. This may cause an update error. 解决方法
  18. 大数据协作框架之kafka
  19. AutoCAD .Net 入门实例
  20. mysql数据库逆心_数据库系统基础笔记(7)--函数

热门文章

  1. spring源码:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的区别
  2. React.js和Vue.js有感—前端开发组件化思想的局部要点理解
  3. C#集成FastDFS断点续传
  4. Message Authentication Code
  5. ubuntu 14.04 32bit依赖库解决
  6. IT要发掘有价值应用
  7. jQuery---仿芒果网机票预定智能输入提示.
  8. C1WebChart 图形化处理。
  9. 使用cardview和recycleview时碰到的一些问题
  10. BZOJ2752[HAOI2012] 高速公路(road)