题目链接

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <queue>
  11. #include <stack>
  12. #include <bitset>
  13. using namespace std;
  14. #define pb(x) push_back(x)
  15. #define ll long long
  16. #define mk(x, y) make_pair(x, y)
  17. #define lson l, m, rt<<1
  18. #define mem(a) memset(a, 0, sizeof(a))
  19. #define rson m+1, r, rt<<1|1
  20. #define mem1(a) memset(a, -1, sizeof(a))
  21. #define mem2(a) memset(a, 0x3f, sizeof(a))
  22. #define rep(i, n, a) for(int i = a; i<n; i++)
  23. #define fi first
  24. #define se second
  25. typedef pair<int, int> pll;
  26. const double PI = acos(-1.0);
  27. const double eps = 1e-;
  28. const int mod = 1e9+;
  29. const int inf = ;
  30. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  31. const int maxn = ;
  32. struct segment
  33. {
  34. double l, r, h;
  35. int flag;
  36. segment(){}
  37. segment(double l, double r, double h, int flag):l(l), r(r), h(h), flag(flag){}
  38. bool operator < (segment a) const
  39. {
  40. return h<a.h;
  41. }
  42. }line[maxn];
  43. double a[maxn], sum[maxn<<];
  44. int cover[maxn<<];
  45. void pushUp(int rt, int l, int r) {
  46. if(cover[rt]) {
  47. sum[rt] = a[r+]-a[l];
  48. } else if(l == r) {
  49. sum[rt] = ;
  50. } else {
  51. sum[rt] = sum[rt<<]+sum[rt<<|];
  52. }
  53. }
  54. void update(int L, int R, int l, int r, int rt, int flag) {
  55. if(L<=l&&R>=r) {
  56. cover[rt] += flag;
  57. pushUp(rt, l-, r-);
  58. return ;
  59. }
  60. int m = l+r>>;
  61. if(L<=m)
  62. update(L, R, lson, flag);
  63. if(R>m)
  64. update(L, R, rson, flag);
  65. pushUp(rt, l-, r-);
  66. }
  67. int main()
  68. {
  69. int n, cnt, k = ;
  70. double x1, y1, x2, y2;
  71. while(scanf("%d", &n)&&n) {
  72. cnt = ;
  73. mem(cover);
  74. for(int i = ; i<n; i++) {
  75. scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
  76. line[cnt] = segment(x1, x2, y1, );
  77. a[cnt++] = x1;
  78. line[cnt] = segment(x1, x2, y2, -);
  79. a[cnt++] = x2;
  80. }
  81. sort(a, a+cnt);
  82. sort(line, line+cnt);
  83. double ans = ;
  84. int num = unique(a, a+cnt)-a;
  85. for(int i = ; i<cnt; i++) {
  86. int L = lower_bound(a, a+num, line[i].l)-a+;
  87. int R = lower_bound(a, a+num, line[i].r)-a;
  88. update(L, R, , num, , line[i].flag);
  89. ans += sum[]*(line[i+].h-line[i].h);
  90. }
  91. printf("Test case #%d\n", k++);
  92. printf("Total explored area: %.2f\n\n", ans);
  93. }
  94. return ;
  95. }

POJ 1151Atlantis 扫描线+线段树求矩形面积并的更多相关文章

  1. POJ 1151 Atlantis 线段树求矩形面积并 方法详解

    第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...

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

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

  3. POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

    题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...

  4. 【hdu1542】线段树求矩形面积并

    分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...

  5. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  6. 【hdu1255】线段树求矩形面积交

    题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...

  7. HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)

    题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...

  8. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

  9. HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板

    好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...

随机推荐

  1. JSON.parse()的异常怎么处理;

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. hibernate中文查询时无查询结果

    原因很简单,问题在于我连接mysql用的url时,没有指定字符集,导致查询不到任何数据 问题出在 hibernate.xml配置文件中: 将 <property name="jdbcU ...

  3. CodeForces - 61E Enemy is weak

    Description The Romans have attacked again. This time they are much more than the Persians but Shapu ...

  4. 发现一个名为“Douyu”的国人项目

    刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...

  5. java中关于如何运行jar格式程序的说明

    通常情况下,我们用打包工具如Eclipse的export工具制作的jar包是无法通过鼠标双击来运行的. 此时我们需要启动DOS窗体,在DOS窗体中输入java命令运行程序(前提是你的环境变量class ...

  6. C# 第三方控件 下面的Item不显示了

    当高版本的第三方版本 替换成低版本的第三方后,item,不显示了之后,请试着再次在这基础上添加一个Item,观察这个Item和原来已经在的却不显示的Item的区别在哪里.然后去源程序正常文件哪里 将这 ...

  7. Oracle的字符替换函数translate用法

    参考文档如下:http://www.banping.com/2009/05/18/oracle_function_translate/ Oracle提供了一个字符替换函数translate,不同于re ...

  8. C++ template学习一(函数模板和模板函数)

    函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...

  9. As Easy As A+B

    Problem Description These days, I am thinking about a question, how can I get a problem as easy as A ...

  10. J - 今年暑假不AC

    J - 今年暑假不AC Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...