【题目】

覆盖的面积

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
 
 
【分析】
  跟矩阵面积并差不多吧。
  不过不要直接改成cnt>=2就交了哦
  如果这个区间完全覆盖只有1,但是子树有完全覆盖的1,那也是可以的哦~
 
  感觉如果问覆盖k次,我还要开个k的数组ORZ。。。
 
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. #define Maxn 100010
  9.  
  10. struct hp
  11. {
  12. int x1,x2,flag;
  13. double y;
  14. }t[Maxn*];int tl;
  15. struct lsh
  16. {
  17. double x;
  18. int id;
  19. }q[Maxn*];int ql;
  20.  
  21. bool cmp(lsh x,lsh y) {return x.x<y.x;}
  22. bool cmp2(hp x,hp y) {return x.y<y.y;}
  23.  
  24. int mymin(int x,int y) {return x<y?x:y;}
  25.  
  26. double dis[*Maxn];
  27.  
  28. struct node
  29. {
  30. int l,r,lc,rc,cnt;
  31. double sm,fg;
  32. }tr[Maxn*];int len;
  33. int build(int l,int r)
  34. {
  35. int x=++len;
  36. tr[x].l=l;tr[x].r=r;
  37. tr[x].sm=tr[x].cnt=;tr[x].fg=;
  38. if(l<r-)
  39. {
  40. int mid=(tr[x].l+tr[x].r)>>;
  41. tr[x].lc=build(l,mid);
  42. tr[x].rc=build(mid,r);
  43. }
  44. else tr[x].lc=tr[x].rc=;
  45. return x;
  46. }
  47.  
  48. void upd(int x)
  49. {
  50. int l=tr[x].l,r=tr[x].r,lc=tr[x].lc,rc=tr[x].rc;
  51. if(tr[x].cnt!=) tr[x].fg=dis[r]-dis[l];
  52. else tr[x].fg=tr[lc].fg+tr[rc].fg;
  53. if(tr[x].cnt>=) tr[x].sm=dis[r]-dis[l];
  54. else if(tr[x].cnt==) tr[x].sm=tr[lc].fg+tr[rc].fg;
  55. else tr[x].sm=tr[lc].sm+tr[rc].sm;
  56. }
  57.  
  58. void change(int x,int l,int r,int c)
  59. {
  60. if(tr[x].l==l&&tr[x].r==r)
  61. {
  62. tr[x].cnt+=c;
  63. upd(x);
  64. return;
  65. }
  66. int mid=(tr[x].l+tr[x].r)>>;
  67. if(r<=mid) change(tr[x].lc,l,r,c);
  68. else if(l>=mid) change(tr[x].rc,l,r,c);
  69. else
  70. {
  71. change(tr[x].lc,l,mid,c);
  72. change(tr[x].rc,mid,r,c);
  73. }
  74. upd(x);
  75. }
  76.  
  77. int main()
  78. {
  79. int T;
  80. int n;
  81. scanf("%d",&T);
  82. while(T--)
  83. {
  84. scanf("%d",&n);
  85. if(n==) break;
  86. tl=;ql=;
  87. for(int i=;i<=n;i++)
  88. {
  89. double x1,y1,x2,y2;
  90. scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
  91. //t[++tl].x1,
  92. t[++tl].flag=;t[tl].y=y1;
  93. t[++tl].flag=-;t[tl].y=y2;
  94. q[++ql].x=x1,q[ql].id=tl;
  95. q[++ql].x=x2,q[ql].id=tl+*n;
  96. }
  97. sort(q+,q++ql,cmp);
  98. int p=;
  99. for(int i=;i<=ql;i++)
  100. {
  101. if(q[i].x!=q[i-].x||p==) p++,dis[p]=dis[p-]+q[i].x-q[i-].x;
  102. if(q[i].id<=*n) t[q[i].id].x1=t[q[i].id-].x1=p;
  103. else t[q[i].id-*n].x2=t[q[i].id--*n].x2=p;
  104. }
  105. sort(t+,t++tl,cmp2);
  106. len=;tr[].sm=;
  107. build(,p);
  108. double ans=;
  109. for(int i=;i<tl;i++)
  110. {
  111. // printf("%d %d\n",t[i].x1,t[i].x2);
  112. change(,t[i].x1,t[i].x2,t[i].flag);
  113. ans+=tr[].sm*(t[i+].y-t[i].y);
  114. }
  115. printf("%.2lf\n",ans);
  116. // printf("Test case #%d\nTotal explored area: %.2lf\n\n",++kase,ans);
  117. }
  118. return ;
  119. }

2016-11-10 14:37:49

  

【 HDU 1255】 覆盖的面积(矩阵面积交,线段树,扫描法)的更多相关文章

  1. hdu1255 矩阵的交 线段树+扫描线

    /* 不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么, 应该是,可以确定,这个区间被完全覆盖了1次, 而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了, 只要加上t[ ...

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

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

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

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

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

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

  5. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. hdu 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  7. HDU 2795 Billboard(宣传栏贴公告,线段树应用)

    HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意:  要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...

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

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

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

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

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

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

随机推荐

  1. oracle report err:REP-2103 PL/SQL formula returned invalid value or no value

    好多年没用report builder做报表了,最近又开始接触这玩意了,今天修改一个report,调试半天没发现逻辑问题,一直报REP-2103: Column 'CF_report_line_po' ...

  2. Nginx高性能服务器安装、配置、运维 (5) —— Nginx虚拟主机配置

    六.Nginx虚拟主机配置 建立基于域名的虚拟主机: (1)建立基于域名的虚拟主机配置文件(以abc.com为例): (2)更改虚拟主机配置文件: 更改配置如下(更改部分即可): server { l ...

  3. Bind开启IPv6功能

    [root@localhost sbin]# ./named -v bind 9.5.1-p3-v3.0.9 1,服务器开启IPv6服务 网卡配置v6地址 [root@localhost ~]# if ...

  4. 跨时钟域设计【一】——Slow to fast clock domain

    跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...

  5. 【转】性能测试设计和LR原理的探讨

    做了4个迭代的性能测试, 在没有需求的情况下步步艰辛,把代码和框架独立开发从0到一万多行代码的测试工具(脚本),作为性能测试工具佼佼者Lr,我时而拿他作参考,山寨了它很多 东西,同时带有很多疑问对它实 ...

  6. 在jsp中的css

    div#one{}div#two{ width:auto; height:20px;background-color:#FAEBD7;text-align:right;}div#three{ widt ...

  7. 20160417javaweb之servlet监听器

    监听器:监听器就是一个java程序,功能是监听另一个java对象变化(方法调用.属性变更) 8个监听器,分为了3种 写一个类实现响应的接口 注册监听器 -- 在web.xml中注册监听器 1.用来监听 ...

  8. jasper3

    package jasper; import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStr ...

  9. ios tableview 上加 textfiled

    ios tableview 上加 textfiled 首先附上我项目中用曾经用到的几张图  并说明一下我的用法: 图1: 图2: 图3: 心在你我说一下  我当初的实现 方法 ,希望能给你们一些  启 ...

  10. 不同浏览器下css 透明度的写法

    filter:alpha(opacity=90); /* IE transparent */ -moz-opacity:0.9; /* Moz + FF transparent */ opacity: ...