题目大意:给若干个矩形,统计重叠次数不为0的面积。

题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可。这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<map>
  4. # include<vector>
  5. # include<cstring>
  6. # include<algorithm>
  7. using namespace std;
  8. # define mid (l+(r-l)/2)
  9.  
  10. const int N=1000;
  11.  
  12. void read(int &x)
  13. {
  14. x=0;
  15. char c;
  16. while((c=getchar())&&(c<'0'||c>'9'));
  17. x=c-'0';
  18. while(c=getchar()){
  19. if(c<'0'||c>'9') break;
  20. x=x*10+c-'0';
  21. }
  22. }
  23.  
  24. //*****************************************
  25.  
  26. struct Node
  27. {
  28. int c;
  29. double len;
  30. };
  31. struct Segment
  32. {
  33. double x1,x2,y;
  34. int d;
  35. };
  36. Segment seg[N*2+5];
  37. map<double,int>mp;
  38. vector<double>v;
  39. Node tr[(N<<3)+5];
  40.  
  41. bool comp(const Segment &s1,const Segment &s2)
  42. {
  43. return s1.y<s2.y;
  44. }
  45.  
  46. void pushUp(int rt)
  47. {
  48. tr[rt].len=tr[rt<<1].len+tr[rt<<1|1].len;
  49. }
  50.  
  51. void build(int rt,int l,int r)
  52. {
  53. tr[rt].c=0;
  54. tr[rt].len=0.0;
  55. if(l==r) return ;
  56. build(rt<<1,l,mid);
  57. build(rt<<1|1,mid+1,r);
  58. }
  59.  
  60. void update(int rt,int l,int r,int L,int R,int d)
  61. {
  62. if(l==r){
  63. tr[rt].c+=d;
  64. if(tr[rt].c>1) tr[rt].len=v[r]-v[l-1];
  65. else tr[rt].len=0;
  66. }else{
  67. if(L<=mid) update(rt<<1,l,mid,L,R,d);
  68. if(R>mid) update(rt<<1|1,mid+1,r,L,R,d);
  69. pushUp(rt);
  70. }
  71. }
  72.  
  73. int main()
  74. {
  75. //freopen("in.txt","r",stdin);
  76. int T,n;
  77. read(T);
  78. while(T--)
  79. {
  80. read(n);
  81. v.clear();
  82. mp.clear();
  83. double x1,x2,y1,y2;
  84. for(int i=0;i<n;++i){
  85. scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
  86. seg[i<<1].x1=seg[i<<1|1].x1=x1;
  87. seg[i<<1].x2=seg[i<<1|1].x2=x2;
  88. seg[i<<1].y=y1,seg[i<<1|1].y=y2;
  89. seg[i<<1].d=1,seg[i<<1|1].d=-1;
  90. v.push_back(x1);
  91. v.push_back(x2);
  92. }
  93. n<<=1;
  94. sort(seg,seg+n,comp);
  95. sort(v.begin(),v.end());
  96. int m=unique(v.begin(),v.end())-v.begin();
  97. for(int i=0;i<m;++i) mp[v[i]]=i+1;
  98.  
  99. seg[n].y=seg[n-1].y;
  100. build(1,1,m-1);
  101. double ans=0.0;
  102. for(int i=0;i<n;++i){
  103. update(1,1,m-1,mp[seg[i].x1],mp[seg[i].x2]-1,seg[i].d);
  104. ans+=tr[1].len*(seg[i+1].y-seg[i].y);
  105. //cout<<tr[1].len<<endl;
  106. }
  107. printf("%.2lf\n",ans);
  108. }
  109. return 0;
  110. }

  

HDU-1255 覆盖的面积 (扫描线)的更多相关文章

  1. hdu 1255 覆盖的面积 (扫描线求矩形交)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

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

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

  4. hdu 1255 覆盖的面积(线段树 面积 交) (待整理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   In ...

  5. hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)

    了校赛,还有什么途径可以申请加入ACM校队?  覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memo ...

  7. HDU 1255 覆盖的面积(线段树+扫描线)

    题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...

  8. HDU 1255 覆盖的面积(线段树:扫描线求面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...

  9. HDU 1255 覆盖的面积 (线段树扫描线+面积交)

    自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了  题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...

  10. HDU 1255 覆盖的面积 (线段树+扫描线+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...

随机推荐

  1. 傅里叶变换:MP3、JPEG和Siri背后的数学

    九年前,当我还坐在学校的物理数学课的课堂里时,我的老师为我们讲授了一种新方法,给我留下了深刻映像.我认为,毫不夸张地说,这是对数学理论发现最广泛的应用.应用的领域包括:量子物理.射电天文学.MP3和J ...

  2. JVM-对象的存活与死亡

    当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...

  3. Embedded binary is not signed with the same certificate as the parent app

    I face the same issue too,I solve it by this: First, I reCreate my team develop certificate(Because ...

  4. LINQ基础 之 LINQ TO SQL (二)

    配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...

  5. EF学习笔记(一)

    EF(EntityFramwork)实体框架:主要是将实体类(EntityClass)和数据表(Table)进行映射(Map). EF核心对象: DbContext   (数据访问核心对象)      ...

  6. LeetCode222 Count Complete Tree Nodes

    对于一般的二叉树,统计节点数目遍历一遍就可以了,但是这样时间复杂度O(n),一下就被卡住了. 这题首先要明白的是,我们只需要知道叶子节点的数目就能统计出总节点树. 想法1: 既然是完全二叉树,我肯定是 ...

  7. GSM cell phone calls use outdated encryption that can now be cracked with rainbow tables on a PC

    Decrypting GSM phone calls Motivation. GSM telephony is the world’s most popular communication techn ...

  8. atomic和nonatomic的区别

    1.使用atomic进行修饰的属性,在实现文件中不能重写setter方法和getter方法,不然在编译过程会发生报错. 1.使用nonatomic进行修饰的属性,在实现文件中可以重写setter方法和 ...

  9. Emacs和Ultra Edit列编辑模式

    在emacs中可以使用C-r系列组合键进行区域选择编辑,或者使用emacs自带的cua-mode,然后键入C-ret进行可视化列编辑. 使用Ultra Edit同样可以方便的进入列编辑模式,只需要按下 ...

  10. HDU 4004

    http://acm.hdu.edu.cn/showproblem.php?pid=4004 题意:青蛙过长L的河,只能落在石头上,石头数量是n,给出n个坐标,至多跳m次,求在可以过河的条件下,青蛙跳 ...