Atlantis poj1151 线段树扫描线
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 线段树扫描线相关推荐
- POJ1151(线段树+扫描线求矩形面积并)
题目:http://poj.org/problem?id=1151 #include <iostream> #include <string.h> #include <a ...
- POJ1151 Atlantis(线段树,扫描线,离散化,矩形面积并)
题目: Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23220 Accepted: 8657 Descrip ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- 亚特兰蒂斯【线段树+扫描线+离散化】
亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...
- 线段树扫描线求矩形周长详解
线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...
- hdu3255 线段树扫描线求体积
题意: 给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路: 线段树扫描线 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- POJ_1151 Atlantis(线段树)
/*线段树扫描线问题,感觉可以作为这类问题的模板.问过师兄以后才过的... 按y轴建线段树.*/ struct node{int l, r, c; //c表示被覆盖的情况,不为0表示被覆盖 doubl ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 732 Solved: ...
最新文章
- 如何搭建高可用Redis服务
- Static与函数指针 转
- svn提示out of date的解决方法
- Ubuntu16.04+caffe+digits安装配置
- 4月5G手机出货量出炉:5G未成主流,你换机了吗?
- TensorFlow的基础概念04
- win10系统可禁用的服务器,Win10系统SysMain服务是什么?Win10系统SysMain能不能禁用?...
- 判断数组是否为某二叉搜索树的后序遍历
- 【实习周记】ArrayMap源码分析
- 查询中接受的主体参数
- SOPC之占空比控制LED(小梅哥AC620)
- 深度学习机器人交易_使用深度学习创建股票交易机器人
- 高考2021北京录取成绩查询,2021北京地区高考成绩排名查询,北京高考各高中成绩喜报榜单...
- QT程序退出后托盘图标不消失问题
- 李兴华内部JAVA培训视频 (难找啊)
- App/QoE-Based Congestion control
- [Vue warn]: Duplicate keys detected: ‘user‘. This may cause an update error. 解决方法
- 大数据协作框架之kafka
- AutoCAD .Net 入门实例
- mysql数据库逆心_数据库系统基础笔记(7)--函数
热门文章
- spring源码:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的区别
- React.js和Vue.js有感—前端开发组件化思想的局部要点理解
- C#集成FastDFS断点续传
- Message Authentication Code
- ubuntu 14.04 32bit依赖库解决
- IT要发掘有价值应用
- jQuery---仿芒果网机票预定智能输入提示.
- C1WebChart 图形化处理。
- 使用cardview和recycleview时碰到的一些问题
- BZOJ2752[HAOI2012] 高速公路(road)