题意:求n个矩阵的面积并。

  1. /*
  2. 线段树维护扫描线
  3. 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1。
  4. 并且如果这条线段添加之前它所在的区间的cover>0,则统计面积。
  5. 另外如果求面积的交集,线段所在的区间的cover>1时统计面积。
  6.  
  7. PS:个人认为某位大神写的博客很好理解(这位大神还搞了一个线段树专辑?%%%):
  8. http://www.cnblogs.com/ka200812/archive/2011/11/13/2247064.html
  9. 但是我觉得第一种算法每次都要找到叶子节点,貌似有点浪费时间,然而第二种又不会。。。
  10. */
  11. #include<cstdio>
  12. #include<iostream>
  13. #include<algorithm>
  14. #define N 110
  15. using namespace std;
  16. double y[N*];int n,cnt,Cas;
  17. struct node{
  18. double x,y_down,y_up;int flag;
  19. bool operator < (const node &s1)const{
  20. return x<s1.x;
  21. }
  22. };node e[N*];
  23. struct Node{
  24. double x,y_down,y_up;int cover;
  25. int flag;//是否为叶子节点
  26. };Node tree[*N];
  27.  
  28. void build(int k,int l,int r){
  29. tree[k].cover=;
  30. tree[k].x=-;//代表这个区间最近一次的横坐标
  31. tree[k].y_down=y[l];
  32. tree[k].y_up=y[r];
  33. tree[k].flag=;
  34. if(l+==r){
  35. tree[k].flag=;
  36. return;
  37. }
  38. int mid=l+r>>;
  39. build(k*,l,mid);
  40. build(k*+,mid,r);
  41. }
  42.  
  43. double insert(int k,double x,double l,double r,int flag){
  44. if(r<=tree[k].y_down||l>=tree[k].y_up) return ;
  45. if(tree[k].flag){
  46. if(tree[k].cover>){
  47. double ans=(x-tree[k].x)*(tree[k].y_up-tree[k].y_down);
  48. tree[k].cover+=flag;
  49. tree[k].x=x;
  50. return ans;
  51. }
  52. else {
  53. tree[k].cover+=flag;
  54. tree[k].x=x;
  55. return ;
  56. }
  57. }
  58. double ans=;
  59. ans+=insert(k*,x,l,r,flag);
  60. ans+=insert(k*+,x,l,r,flag);
  61. return ans;
  62. }
  63.  
  64. int main(){
  65. while(scanf("%d",&n)){
  66. if(!n) break;
  67. cnt=;
  68. for(int i=;i<=n;i++){
  69. double x1,y1,x2,y2;
  70. scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
  71. y[++cnt]=y1;
  72. e[cnt].x=x1;
  73. e[cnt].y_down=y1;
  74. e[cnt].y_up=y2;
  75. e[cnt].flag=;
  76. y[++cnt]=y2;
  77. e[cnt].x=x2;
  78. e[cnt].y_down=y1;
  79. e[cnt].y_up=y2;
  80. e[cnt].flag=-;
  81. }
  82. sort(y+,y+cnt+);//写成了sort(y,y+cnt+1),1WA
  83. sort(e+,e+cnt+);
  84. build(,,cnt);
  85. double ans=;
  86. for(int i=;i<=cnt;i++){
  87. ans+=insert(,e[i].x,e[i].y_down,e[i].y_up,e[i].flag);
  88. }
  89. printf("Test case #%d\nTotal explored area: %.2f\n\n",++Cas,ans);
  90. }
  91. return ;
  92. }

Atlantis(hdu1542)的更多相关文章

  1. 扫面线+线段树(hdu1542)

    之前写过这个算法,时间长了就忘掉了,,现在不看书自己努力回想起来,对算法的理解,对线段树的理解感觉也更深了一点(可能心理作用,哈哈哈) 思路简单说一下吧 从做到右遍历每一条矩阵的边(左右边),看该边对 ...

  2. HDU 1542 Atlantis(扫描线算法)

    题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...

  3. POJ 1151 Atlantis(离散化)

    点我看题目 题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来. 思路 : 离散化求矩形面积并.离散化具体介绍.将横纵坐标离散开来分别存,然后排序,也可以按照黑书上 ...

  4. HDU 1542 Atlantis(扫描线)题解

    题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...

  5. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

  6. HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)

    传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...

  7. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  8. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  9. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

随机推荐

  1. 04.Java多线程并发库API使用3

    1.java5的Semaphere同步工具 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数 ...

  2. UVa OJ 494

     Kindergarten Counting Game  Everybody sit down in a circle. Ok. Listen to me carefully. ``Woooooo, ...

  3. (转)Spring的概述

    http://blog.csdn.net/yerenyuan_pku/article/details/69663685 Spring的概述 什么是Spring 据度娘所载: Spring是一个开源框架 ...

  4. iview upload on-format-error 事件 在 before-upload 事件 之后,导致在before里面阻止上传后,监测事件失效,需要自己手工写

    iview upload on-format-error 事件 在 before-upload 事件 之后,导致在before里面阻止上传后,监测事件失效,需要自己手工写

  5. MySQL系列(二)--MySQL存储引擎

    影响数据库性能的因素: 1.硬件环境:CPU.内存.存盘IO.网卡流量等 2.存储引擎的选择 3.数据库参数配置(影响最大) 4.数据库结构设计和SQL语句 MySQL采用插件式存储引擎,可以自行选择 ...

  6. HTML5新特性之History

    几年前,Ajax的兴起给互联网带来了新的生机,同时也使用户体验有了质的飞跃,用户无需刷新页面即可获取新的数据,而页面也以一种更具有交互性的形式为用户展现视图,可以说这种变化对互联网发展的贡献是史无前例 ...

  7. linux 查看分区UUID的两种方法

    1. sudo blkid /dev/loop0: TYPE="squashfs"/dev/loop1: TYPE="squashfs"/dev/loop2: ...

  8. 为何ARM linux会引入Device Tree(转)

    http://www.360doc.com/content/14/0522/20/14530056_380011180.shtml

  9. 【问题探索日志】python 函数优化

    # 事情是这样的,我写的一个程序帧率上不去. 然后发现了一个疑似有问题的地方,如下 def around(x,y): around_dict = {(i,j) for i in range(-1,2) ...

  10. python基础 : 1.计算机基础 2.注释 3.变量 4.标识符 5.输出 6.格式化输出 7.输入 8.算数运算符 9.字符串操作