覆盖的面积

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5595    Accepted Submission(s): 2810

Problem Description
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.

 
Input
输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.

注意:本题的输入数据较多,推荐使用scanf读入数据.

 
Output
对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.
 
Sample Input
2
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
3
0 0 1 1
1 0 2 1
2 0 3 1
 
Sample Output
7.63
0.00
 
Author
Ignatius.L & weigang Lee
 

题意:

给出矩形左下和右上角的坐标,求矩形交的面积。

代码:

  1. //cnt[rt]>=2的一定是覆盖过两次以上的,直接计算。cnt[rt]==1时,如果rt的左右儿子
  2. //被覆盖过大于等于1次,那么再被他们父亲覆盖上就是覆盖过两次了,值是左右儿子被
  3. //覆盖过一次的长度的和。cnt[rt]==0照常更新。sum2记录覆盖过两次以上的边的长度。
  4. //sum1记录覆盖过一次的边的长度。
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<algorithm>
  9. using namespace std;
  10. const int maxn=;
  11. double sum1[maxn*],sum2[maxn*],mp[maxn];
  12. int cnt[maxn*];
  13. struct node{
  14. double l,r,h;
  15. int d;
  16. node(){}
  17. node(double a,double b,double c,int d):l(a),r(b),h(c),d(d){}
  18. bool operator < (const node &p)const{
  19. if(h==p.h) return d>p.d;
  20. return h<p.h;
  21. }
  22. }nodes[maxn*];
  23. int Bsearch(double a,int b,double *c)
  24. {
  25. int l=,r=b-,mid;
  26. while(l<=r){
  27. mid=(l+r)>>;
  28. if(c[mid]==a) return mid;
  29. else if(c[mid]>a) r=mid-;
  30. else l=mid+;
  31. }
  32. return -;
  33. }
  34. void Pushup(int l,int r,int rt)
  35. {
  36. if(cnt[rt]){
  37. sum1[rt]=mp[r+]-mp[l];
  38. if(cnt[rt]==)
  39. sum2[rt]=sum1[rt<<]+sum1[rt<<|];
  40. else sum2[rt]=mp[r+]-mp[l];
  41. }
  42. else if(l==r) sum1[rt]=sum2[rt]=;
  43. else{
  44. sum1[rt]=sum1[rt<<]+sum1[rt<<|];
  45. sum2[rt]=sum2[rt<<]+sum2[rt<<|];
  46. }
  47. }
  48. void Update(int ql,int qr,int v,int l,int r,int rt)
  49. {
  50. if(ql<=l&&qr>=r){
  51. cnt[rt]+=v;
  52. Pushup(l,r,rt);
  53. return;
  54. }
  55. //if(l==r) return;
  56. int m=(l+r)>>;
  57. if(ql<=m) Update(ql,qr,v,l,m,rt<<);
  58. if(qr>m) Update(ql,qr,v,m+,r,rt<<|);
  59. Pushup(l,r,rt);
  60. }
  61. int main()
  62. {
  63. int t,n;
  64. scanf("%d",&t);
  65. while(t--){
  66. scanf("%d",&n);
  67. int m=,nu=;
  68. double x1,y1,x2,y2;
  69. memset(sum1,,sizeof(sum1));
  70. memset(sum2,,sizeof(sum2));
  71. memset(cnt,,sizeof(cnt));
  72. for(int i=;i<n;i++){
  73. scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
  74. nodes[m++]=node(x1,x2,y1,);
  75. nodes[m++]=node(x1,x2,y2,-);
  76. mp[nu++]=x1;mp[nu++]=x2;
  77. }
  78. sort(mp,mp+nu);
  79. nu=unique(mp,mp+nu)-mp;
  80. sort(nodes,nodes+m);
  81. double ans=;
  82. for(int i=;i<m-;i++){
  83. int lef=Bsearch(nodes[i].l,nu,mp);
  84. int rig=Bsearch(nodes[i].r,nu,mp)-;
  85. if(lef<=rig)
  86. Update(lef,rig,nodes[i].d,,nu-,);
  87. ans+=sum2[]*(nodes[i+].h-nodes[i].h);
  88. }
  89. printf("%.2lf\n",ans);
  90. }
  91. return ;
  92. }

HDU1255 扫描线 矩形交面积 离散化的更多相关文章

  1. HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...

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

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

  3. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  4. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  5. CCF 201312-3 最大的矩形 (暴力,离散化)

    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...

  6. HDU 5130 Signal Interference --计算几何,多边形与圆的交面积

    题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...

  7. Open-air shopping malls(二分半径,两元交面积)

    http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...

  8. TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)

    描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...

  9. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

随机推荐

  1. JavaScript 正则

    元字符 预定义类 边界 ^在中括号中时,匹配非hello的 str = 'hello world' str.match(/[^hello]/g) //[" ", "w&q ...

  2. 水管工游戏:dfs(递归)

    添柴网这题好想不能评测,所以不确保代码的正确性 题目描述: 这小节有点难,看不太懂可以跳过哦.最近小哼又迷上一个叫做水管工的游戏.游戏的大致规则是这样的.一块矩形土地被分为N * M的单位正方形,现在 ...

  3. java DTO 转 POJO

    如果这两个类的要转化的属性其属性名不一样的话,那只能用get和set方法赋值 如果你的两个类要转化的属性名都一样,那可以用org.springframework.beans.BeanUtils这个类来 ...

  4. Struts2文件上传带进度条,虽然不是很完美

    好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...

  5. 11.24Daily Scrum(4)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ...

  6. 第十八次ScrumMeeting会议

    第十八次Scrum Meeting 时间:2017/12/8 地点:线上+SPR咖啡馆 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工 ...

  7. JavaScript初探系列之数组的基本操作

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只 ...

  8. CSS基础小记

    2017/10/29 CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字 ...

  9. 【IdentityServer4文档】- 欢迎来到 IdentityServer4

    欢迎来到 IdentityServer4 IdentityServer4 是一款包含和实现了 OpenID Connect 和 OAuth 2.0 协议的,适用于 ASP.NET Core 的框架 . ...

  10. Java中的死锁问题

    死锁问题: 例如有两个线程, 线程1与线程2. 线程1在执行的过程中, 要锁定对象1, 2才能完成整个操作, 首先锁定对象1, 再锁定对象2. 线程2在执行的过程中, 要锁定对象2, 1才能完成整个操 ...