解题思路:线段树求面积并,水题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;const int maxn = 1005;
const double eps = 1e-8;
struct Segment
{int l,r,cover;double len;
}tree[maxn<<2];
struct Line
{int val;double x,y1,y2;Line(){}Line(double _x,double _y1,double _y2,int _val){x = _x;y1 = _y1;y2 = _y2;val = _val;}
};
int n,tmpsize,size;
double edge[maxn],tmp[maxn];
vector<Line> vec;void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;tree[rt].cover = tree[rt].len = 0;if(l + 1 == r) return;int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid,r);
}void insert(int rt,int l,int r,int val)
{if(l <= tree[rt].l && tree[rt].r <= r){tree[rt].cover += val;if(tree[rt].cover == 0){if(tree[rt].l + 1 == tree[rt].r) //叶子节点,没有被覆盖的话长度只能为0tree[rt].len = 0;else tree[rt].len = tree[rt<<1].len + tree[rt<<1|1].len;}else tree[rt].len = edge[tree[rt].r] - edge[tree[rt].l];return;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(l < mid) insert(rt<<1,l,r,val);if(mid < r) insert(rt<<1|1,l,r,val);if(tree[rt].cover == 0)tree[rt].len = tree[rt<<1].len + tree[rt<<1|1].len;else tree[rt].len = edge[tree[rt].r] - edge[tree[rt].l];
}bool cmp(Line a,Line b)
{return a.x < b.x;
}void DiscretData()
{sort(tmp,tmp+tmpsize);size = 0;edge[++size] = tmp[0];for(int i = 1; i < tmpsize; i++)if(fabs(tmp[i] - tmp[i-1]) > eps)edge[++size] = tmp[i];
}int bisearch(double val)
{int l = 0, r = size, mid;while(l <= r){mid = (l + r) >> 1;if(fabs(edge[mid] - val) < eps) return mid;else if(edge[mid] - val > eps)r = mid - 1;else l = mid + 1;}
}int main()
{int cas = 1;double x1,y1,x2,y2;while(scanf("%d",&n),n){tmpsize = 0;vec.clear();for(int i = 1; i <= n; i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);vec.push_back(Line(x1,y1,y2,1));vec.push_back(Line(x2,y1,y2,-1));tmp[tmpsize++] = y1;tmp[tmpsize++] = y2;}DiscretData();sort(vec.begin(),vec.end(),cmp);build(1,1,size);double ans = 0;for(int i = 0; i < vec.size(); i++){if(i > 0)ans += tree[1].len * (vec[i].x - vec[i-1].x);int l = bisearch(vec[i].y1);int r = bisearch(vec[i].y2);insert(1,l,r,vec[i].val);}printf("Test case #%d\nTotal explored area: %.2f\n\n",cas++,ans);}return 0;
}

poj 1151(线段树求面积并)相关推荐

  1. hdu 2461(线段树求面积并)

    题意:给出N个矩形,M次询问 每次询问给出R个,问这R个矩形围成的面积 解题思路:对于每次询问,做一次线段树求面积的并操作. 每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l ...

  2. POJ 1151 线段树+扫描线

    题意:求矩形面积的并 思路: 注意是[l,mid][mid,r] 这是真正的线段了 就当扫描线模板使吧~ //By SiriusRen #include <cmath> #include ...

  3. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  4. 线段树求逆序对(hdu1394Minimum Inversion Number)

    说实话,线段树求逆序对我理解了半天诶,不知是否有人像我一样. 对于每个数来说,只有和已经出现过的.比它大的数才能形成逆序对,那么在给定的数列中,每给一个数就向前找比它大的数. 样例:10 1 3 6 ...

  5. 吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)

    链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  6. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

  7. poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长

    Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...

  8. 线段树求矩形面积并 扫描线+离散化

    顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中,这根线很重要.方向的话,可以左右扫,也可以上下扫.方法是一样的,这里我用的是由下向上的扫描法. 如上图所示,坐标系内有两个矩形.位置 ...

  9. poj 2985(并查集+线段树求K大数)

    解题思路:这道题并查集很容易,合并时找到父节点就直接加上去就ok了.关键是如何求K大数,我一直在想用线段树怎么写,一开始想如果直接记录数的大小那肯定是没戏了,借鉴了一下别人的思路:区间[a,b]记录的 ...

最新文章

  1. 打印Java数组的最简单方法是什么?
  2. 快速查找无序数组中的第K大数?
  3. android的logcat详细用法
  4. 从pg_hba.conf文件谈谈postgresql的连接认证
  5. 软件设计师07-程序语言基础知识
  6. CVPR2022 Canonical Voting: Towards Robust Oriented Bounding Box Detectionin 3D Scenes
  7. 【c4d学习笔记】对称方向不对的问题
  8. 炒币之止损止盈控制的艺术、投资入门
  9. android 新建桌面文件夹在哪里,添加并管理桌面文件夹
  10. eBay以2.4亿美元收购移动支付服务商Zong
  11. 排名前十的天使投资机构
  12. 北京航空航天大学计算机学院 赵,北京航空航天大学计算机学院计算机应用技术导师介绍:夏春和...
  13. #483(div.2) B. Minesweeper
  14. 与三角有关的级数求和
  15. xiaoxin juju needs help - 组合公式
  16. c语言说明函数的作用是,C语言中rewind函数的作用是什么?
  17. 一个包含学生信息的顺序表
  18. LED、LCD背光源、CCFL
  19. Sass与Compass——回顾
  20. gitlab-ci添加安卓项目构建流程

热门文章

  1. 神策数据斩获大数据星河奖,首发用户行为分析标准
  2. css元素居中方法归纳
  3. 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布 1
  4. 静态自动检查代码缺陷与隐患
  5. (转) OpenLayers3基础教程——OL3 介绍control
  6. 2017广东工业大学程序设计竞赛决赛(官方题解)
  7. cassandra的命令
  8. MyEclipse中文网发布
  9. [转]设置 UILabel 和 UITextField 的 Padding 或 Insets
  10. 领英上面的experience和project的区别