覆盖的面积

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

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
呵呵,这题是在线段树求矩形面积并的基础上再进一步。segment_tree中的len表示覆盖一遍的长度,nlen表示覆盖多遍的长度。这题的重点在于写if语句判断三个要点:1)此区间已经覆盖2遍及以上;2)此区间被覆盖一次,区间是还是不是叶子节点,若不是,则有没有被覆盖两次取决于它子节点len值;3)此区间没被覆盖。
Problem :
1255 ( 覆盖的面积 )     Judge Status :
Accepted
RunId : 17414345    Language : G++    Author :
ksq2013
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
double yy[2100];
struct Line{
int f;
double x,y1,y2;
bool operator<(const Line h)const{
return x<h.x;
}
}line[2100];//index:m;
struct Seg{
int f;
double len,nlen;
}tr[10100];
void build(int s,int t,int k)
{
tr[k].f=tr[k].len=tr[k].nlen=0;
if(s+1==t)return;
int m=(s+t)>>1;
build(s,m,k<<1);
build(m,t,k<<1|1);
}
int bin(double x,int l,int r)
{
while(l<=r){
int mid=(l+r)>>1;
if(yy[mid]==x)return mid;
if(yy[mid]<x)l=mid+1;
else r=mid-1;
}return l;
}
void pushup(int s,int t,int k)
{
if(tr[k].f>1)tr[k].nlen=tr[k].len=yy[t]-yy[s];
else{
if(tr[k].f==1){
tr[k].len=yy[t]-yy[s];
if(s+1==t)tr[k].nlen=0;
else tr[k].nlen=tr[k<<1].len+tr[k<<1|1].len;
}
else{
if(s+1==t)tr[k].nlen=tr[k].len=0;
else{
tr[k].len=tr[k<<1].len+tr[k<<1|1].len;
tr[k].nlen=tr[k<<1].nlen+tr[k<<1|1].nlen;
}
}
}
}
void update(int s,int t,int k,int l,int r,int f)
{
if(l<=s&&t<=r){
tr[k].f+=f;
pushup(s,t,k);
return;
}int m=(s+t)>>1;
if(l<m)update(s,m,k<<1,l,r,f);
if(m<r)update(m,t,k<<1|1,l,r,f);
pushup(s,t,k);
}
int main()
{
int T,n;
double x1,y1,x2,y2;
scanf("%d",&T);
for(;T;T--){
scanf("%d",&n);
int m=0;
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); yy[++m]=y1;
line[m].f=1;//initial number:0;first variable:f;
line[m].x=x1;
line[m].y1=y1;
line[m].y2=y2; yy[++m]=y2;
line[m].f=-1;
line[m].x=x2;
line[m].y1=y1;
line[m].y2=y2;
}
sort(1+yy,1+m+yy);//data input;
sort(1+line,1+m+line);
int k=1;
for(int i=2;i<=m;i++)
if(yy[i-1]!=yy[i])yy[++k]=yy[i];//end; double ans=0;
build(1,k,1);//build a segment_tree;
for(int i=1;i<=m;i++){
update(1,k,1,bin(line[i].y1,1,k),bin(line[i].y2,1,k),line[i].f);//updating segments by binary search;
ans+=tr[1].nlen*(line[i+1].x-line[i].x);
} printf("%.2lf\n",ans);//output the ans;
}
return 0;
}

hdu 1255的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))

    扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...

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

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

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

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

  9. hdu 1255 覆盖的面积

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 #include <cstdio> #include <cstring> #inc ...

  10. hdu 1255(线段树 扫描线) 覆盖的面积

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...

随机推荐

  1. SharePoint 2013 关于自定义显示列表表单的bug

    1.在SharePoint 2013中,我们隐藏列表Dispform页面的ListFormWebPart部件,转而使用自定义显示列表表单进行展示,因为这样更容易定制我们需要的显示: 2.之后发现文件夹 ...

  2. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  3. socket编程listen函数限制连接数的解决方案

    函数原型: int listen(int sockfd, int backlog); 当服务器编程时,经常需要限制客户端的连接个数,下面为问题分析以及解决办法: 下面只讨论TCP  UDP不做讨论(很 ...

  4. ios xcode Code signing failed 解决方案

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min ...

  5. 【转】面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  6. 每日Scrum(5)

    进入冲刺第五天,软件的界面设计成为主打,收集学校的很多美图是我们组的任务: 问题在于软件已很难有很大的改进,大方向也都是变不了的

  7. T-SQL—理解CTEs

    在推出SQLServer2005之后,微软定义了一个新的查询架构叫做公共表表达式--CTE.CTE是一个基于简单查询的临时结果集,在一个简单的插入.更新.删除或者select语句的执行范围内使用.再本 ...

  8. 【故障处理】ORA-28040: No matching authentication protocol

    [故障处理]ORA-28040: No matching authentication protocol 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者 ...

  9. ASP.NET MVC 拓展ViewResult实现word文档下载

      最近项目中有同事用到word文档导出功能,遇到了一些导出失败问题,帮其看了下解决问题的同事,看了下之前的代码发现几个问题: 代码编写不规范,word导出功能未收口 重复代码导出都是 实现逻辑比较复 ...

  10. 安装mysql odbc遇到error 1918.errror installing ODBC driver mysql ODBC 5.3 ANSI Drive

    环境:Windows server2008r2 安装mysql-connector-odbc-5.3.6-win32 报错 相信错误信息:Error 1918.errror installing OD ...