A template of discretization + scaning line + segment tree.

It's easy to understand, but a little difficult for coding as it has a few details.

  1. #include"Head.cpp"
  2. const int N=207;
  3. double x[N<<1];
  4. struct Point{
  5. double l,r,h;
  6. int w;
  7. bool operator< (const Point &b)const{
  8. return h < b.h;
  9. }
  10. }a[N<<2];
  11. struct SegmentTree{
  12. int l,r,w;
  13. double len;
  14. }t[N<<3];
  15. #define lson rt<<1, l, mid
  16. #define rson rt<<1|1, mid+1, r
  17. inline void Pushup(int rt){
  18. if(t[rt].w != 0)
  19. t[rt].len = x[t[rt].r+1] - x[t[rt].l];
  20. else if(t[rt].l == t[rt].r)
  21. t[rt].len = 0;
  22. else // t[rt].w == 0
  23. t[rt].len = t[rt<<1].len + t[rt<<1|1].len;
  24. }
  25. inline void Build(int rt,int l,int r){
  26. t[rt] = (SegmentTree){l, r, 0, 0};
  27. if(l == r) return;
  28. int mid = (l>>1) + (r>>1) + (l&r&1);
  29. Build(lson),Build(rson);
  30. }
  31. inline void Updata(int rt,int L,int R,int val){
  32. if(t[rt].l >= L && t[rt].r <= R){
  33. t[rt].w += val;
  34. Pushup(rt);
  35. return;
  36. }
  37. int mid = (t[rt].l>>1) + (t[rt].r>>1) +(t[rt].l&t[rt].r&1);
  38. if(L <= mid) Updata(rt<<1, L, R, val);
  39. if(R > mid) Updata(rt<<1|1, L, R, val);
  40. Pushup(rt);
  41. }
  42. inline int FindPos(int l,int r,double val){
  43. int mid;
  44. while(l<=r){
  45. mid = (l>>1) + (r>>1) + (l&r&1);
  46. if(x[mid] > val)
  47. r = mid - 1;
  48. else if(x[mid] < val)
  49. l = mid + 1;
  50. else // x[mid] == val
  51. break;
  52. }
  53. return mid;
  54. }
  55. int main(){
  56. int task=0;
  57. int n;
  58. while(~scanf("%d",&n) && n!=0){
  59. int cnt=0;
  60. R(i,1,n){
  61. double x_1,x_2,y_1,y_2;
  62. scanf("%lf%lf%lf%lf",&x_1,&y_1,&x_2,&y_2);
  63. // 1 -> floor, -1 -> ceiling
  64. x[++cnt] = x_1;
  65. a[cnt] = (Point){x_1, x_2, y_1, 1};
  66. x[++cnt] = x_2;
  67. a[cnt] = (Point){x_1, x_2, y_2, -1};
  68. }
  69. sort(x+1, x+cnt+1);
  70. sort(a+1, a+cnt+1);
  71. Build(1, 1, cnt);
  72. double ans = 0;
  73. R(i,1,cnt-1){
  74. int l = FindPos(1, cnt, a[i].l),
  75. r = FindPos(1, cnt, a[i].r) - 1;
  76. Updata(1, l, r, a[i].w);
  77. ans += t[1].len * (a[i+1].h - a[i].h);
  78. }
  79. printf("Test case #%d\nTotal explored area: %.2lf\n\n", ++task, ans);
  80. }
  81. return 0;
  82. }
  83. /*
  84. 2
  85. 10 10 20 20
  86. 15 15 25 25.5
  87. 0
  88. */

HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)的更多相关文章

  1. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. 扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]

    学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...

  3. hdu 1542 & & poj 1151

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. POJ 1151 Atlantis(扫描线)

    题目原链接:http://poj.org/problem?id=1151 题目中文翻译: POJ 1151 Atlantis Time Limit: 1000MS   Memory Limit: 10 ...

  5. [POJ 1151] Atlantis

    一样的题:HDU 1542 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18148   Accepted ...

  6. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  7. POJ 1151 Atlantis 矩形面积求交/线段树扫描线

    Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...

  8. POJ 1151 Atlantis (扫描线+线段树)

    题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...

  9. POJ 1151 Atlantis 线段树+离散化+扫描线

    这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...

随机推荐

  1. Win10系统下怎么让局域网内其他电脑通过IP访问网站

    最近,有位win10系统用户在电脑上制作好网站后,希望能让局域网内的其他电脑通过IP直接访问自己电脑的网站,以便得到更好地测试效果.可是,该用户操作了很久都没成功.那么,我们如何配置win10电脑的I ...

  2. 第06组Alpha冲刺(3/6)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.鲍凌函 3.曾丽莉 4. 曹兰英 5. 方梓涵 6.董翔云 7.杜筱 8.黄少丹 9. 詹鑫冰 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  3. 《Effective C++》阅读总结(三):资源管理

    C++中的资源管理非常重要,在将资源加载到内存后,便可以使用资源了,当我们不再需要资源时,我们要保证其正确的释放,才能将其占用的内存空间归还给操作系统,不正确的释放很容易造成内存泄漏.本章以资源管理类 ...

  4. 『忘了再学』Shell基础 — 26、cut列提取命令

    目录 1.cut命令说明 2.cut命令练习 (1)cut命令基本用法 (2)cut命令选取多列 (3)按字符来进行提取 (4)按指定分隔符进行截取数据 3.cut命令分隔符说明 1.cut命令说明 ...

  5. python变量名下划线

    xx: 公有变量 _x: 单前置下划线,保护变量,私有化属性或方法,不能用于'from module import *' 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其/类 ...

  6. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  7. 如何写出同事看不懂的Java代码?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是没更新就是在家忙着带娃的Hydra. 前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了.五花八门的代码 ...

  8. Vmware-Centos7-NAT 网络配置

    首先一句话总结 NAT模式下,将VMware Network Adapter VMnet8的IP改为与虚拟机IP同一网段即可. 操作步骤 1. 打开虚拟网络编辑器 2. 配置NAT 选择NAT模式,取 ...

  9. SAP 实例 3 Context Menus

    REPORT demo_dynpro_context_menu. DATA: field1 TYPE i VALUE 10, field2 TYPE p DECIMALS 4. DATA: prog ...

  10. Python 中生成器的原理

    生成器的使用 在 Python 中,如果一个函数定义的内部使用了 yield 关键字,那么在执行函数的时候返回的是一个生成器,而不是常规函数的返回值. 我们先来看一个常规函数的定义,下面的函数 f() ...