题目链接

题意:中文题意。

分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt》=0改成cnt>=2就行了,、

但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了,因为虽然现在都不等于

2,但是之前的那个线段加上现在的已经覆盖2次了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <algorithm>
  7. #define LL __int64
  8. #define lson l, mid, 2*rt
  9. #define rson mid+1, r, 2*rt+1
  10. const int maxn = +;
  11. using namespace std;
  12. int n;
  13. double y[maxn];
  14. struct node
  15. {
  16. int l, r, c;
  17. double cnt, lf, rf, more; //cnt还是代表覆盖的长度,增加了more代表两次及以上覆盖的长度
  18. }tr[*maxn];
  19. struct Line
  20. {
  21. double x, y1, y2;
  22. int f;
  23. }line[maxn];
  24. bool cmp(Line a, Line b)
  25. {
  26. return a.x < b.x;
  27. }
  28. void build(int l, int r, int rt)
  29. {
  30. tr[rt].l = l; tr[rt].r = r;
  31. tr[rt].c = ; tr[rt].cnt = ;
  32. tr[rt].more = ;
  33. tr[rt].rf = y[r]; tr[rt].lf = y[l];
  34. if(l+==r) return;
  35. int mid = (l+r)/;
  36. build(l, mid, *rt);
  37. build(mid, r, *rt+);
  38. }
  39. void calen(int rt)
  40. {
  41. if(tr[rt].c==)
  42. {
  43. if(tr[rt].l+==tr[rt].r)
  44. {
  45. tr[rt].cnt = ; tr[rt].more = ;
  46. }
  47. else
  48. {
  49. tr[rt].cnt = tr[*rt].cnt+tr[*rt+].cnt;
  50. tr[rt].more = tr[*rt].more+tr[*rt+].more;
  51. }
  52. }
  53. if(tr[rt].c==) //注意这一步是关键
  54. {
  55. tr[rt].cnt = tr[rt].rf-tr[rt].lf;
  56. if(tr[rt].l+==tr[rt].r) //因为没有注意是否到最后,错了一遍
  57. tr[rt].more = ;
  58. else
  59. tr[rt].more = tr[*rt].cnt + tr[*rt+].cnt; //为1的时候如果下面也有就加上
  60. }
  61. if(tr[rt].c>=)
  62. {
  63. tr[rt].more = tr[rt].rf-tr[rt].lf;
  64. tr[rt].cnt = tr[rt].more;
  65. }
  66. }
  67. void update(int rt, Line e)
  68. {
  69. if(e.y1==tr[rt].lf && e.y2==tr[rt].rf)
  70. {
  71. tr[rt].c += e.f;
  72. calen(rt);
  73. return;
  74. }
  75. if(e.y2<=tr[*rt].rf) update(*rt, e);
  76. else if(e.y1>=tr[*rt+].lf) update(*rt+, e);
  77. else
  78. {
  79. Line tmp;
  80. tmp = e;
  81. tmp.y2 = tr[*rt].rf; update(*rt, tmp);
  82. tmp = e;
  83. tmp.y1 = tr[*rt+].lf; update(*rt+, tmp);
  84. }
  85. calen(rt);
  86. }
  87. int main()
  88. {
  89. int t, i, cnt;
  90. double x1, x2, y1, y2, ans;
  91. scanf("%d", &t);
  92. while(t--)
  93. {
  94. scanf("%d", &n);
  95. cnt = ; ans = ;
  96. for(i = ; i <= n; i++)
  97. {
  98. scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
  99. line[cnt].x = x1; line[cnt].y1 = y1;
  100. line[cnt].y2 = y2; line[cnt].f = ;
  101. y[cnt++] = y1;
  102. line[cnt].x = x2; line[cnt].y1 = y1;
  103. line[cnt].y2 = y2; line[cnt].f = -;
  104. y[cnt++] = y2;
  105. }
  106. sort(y+, y+cnt);
  107. sort(line+, line+cnt, cmp);
  108. cnt --;
  109. build(, cnt, );
  110. update(, line[]);
  111. for(i = ; i <= cnt; i++)
  112. {
  113. ans += tr[].more*(line[i].x - line[i-].x);
  114. update(, line[i]);
  115. }
  116. printf("%.2lf\n", ans);
  117. }
  118. return ;
  119. }

HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)的更多相关文章

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

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

  2. POJ 1151Atlantis 扫描线+线段树求矩形面积并

    题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...

  3. hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=5091 给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最 ...

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

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

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

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

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

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

  7. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  8. POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

  9. POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]

    Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Descrip ...

随机推荐

  1. Liferay SDK 6.2与7.0中build.[$username].properties 文件的配置

    这篇文章是针对刚开始开发Liferay的新手写的,希望能够帮到刚入门的开发者减少一些配置上的麻烦. 前提: 1. 下载了Liferay IDE(Liferay的官方开发工具) 2.下载了Liferay ...

  2. PDF.NET框架操作——工具应用(一)

    PDF.NET是个开源的项目其解决UI层(WinForm / Web)控件数据绑定.映射与查询: BLL层实体对象查询(OQL):DAL层SQL语句和.NET数据访问代码映射(查看  SQL-MAP ...

  3. PythonChallenge 1:恺撒密码的解码

    题目: 解题思路:根据图中的K→M,O→Q,E→G,我们可以发现K,O,E这三个字母都向后移动了2位.据说恺撒率先使用了这一加密方法,因此将其命名为恺撒密码.它的基本思想是:通过把字母移动一定的位数来 ...

  4. C# textbox 滚动条 随文本输入 滚动

    tb_Log.SelectionStart = tb_Log.Text.Length;//设置光标位置 tb_Log.ScrollToCaret();//随文本输入 滚动

  5. HDU 1385 Minimum Transport Cost (最短路,并输出路径)

    题意:给你n个城市,一些城市之间会有一些道路,有边权.并且每个城市都会有一些费用. 然后你一些起点和终点,问你从起点到终点最少需要多少路途. 除了起点和终点,最短路的图中的每个城市的费用都要加上. 思 ...

  6. hdu 1271 整数对

    看了别人的解题报告a了, 大致思路就是 A=a+b*10^k+c*10^(k+1) B=a+c*10^k (在A中取出一位数后) N=A+B=2*a+b*10^k+11*c*10^k 这样就好做了,再 ...

  7. [hackerrank]Manasa and Stones

    https://www.hackerrank.com/contests/w2/challenges/manasa-and-stones 简单题. #include<iostream> us ...

  8. 【mongoDB高级篇①】聚集运算之group,aggregate

    group 语法 db.collection.group({ key:{field:1},//按什么字段进行分组 initial:{count:0},//进行分组前变量初始化,该处声明的变量可以在以下 ...

  9. Hadoop基础教程之搭建开发环境及编写Hello World

    整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclipse方便. 1.下载 进入官网:http://eclipse.org/do ...

  10. Linux资源监控命令/工具(网络)

    1.手动/自动设定与启动/关闭IP参数:ifconfig,ifup,ifdown      这三个指令的用途都是在启动网络接口,不过,ifup与ifdown仅能就/etc/sysconfig/netw ...