覆盖的面积

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

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

题目大意:

求n个矩形重复覆盖的面积。

线段树求矩形交的经典题。

首先离散化还是要去重,即使是浮点数,我的去重离散化模板还是稳得住的。

其次线段树节点中的cov要理解好。

最后跟标准线段树可以有些不同的,毕竟query永远是全部询问。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#define ll long long
#define maxn 1000 using namespace std; double t[maxn*+];//排序数组
double a[maxn*+];//原始数据
int b[maxn*+];//离散后的数据
double to[maxn*+];//离散后的数据到原数据的映射 struct tseg
{
int x1,x2,y;
int flag;//+1表示下边,-1表示上边
bool operator<(const tseg& b) const
{
return y<b.y;
}
};
tseg seg[maxn*+]; struct ttree
{
int l,r;
int cov;//cov是扫描线的重点 -1不确定 >=0完全覆盖次数
inline double len()
{
return to[r]-to[l];
}
};
ttree tree[maxn**+]; void pushup(int x)
{
if(tree[x].l+==tree[x].r)
return;
if(tree[x*].cov==tree[x*+].cov)
tree[x].cov=tree[x*].cov;
else
tree[x].cov=-;
} void pushdown(int x)
{
if(tree[x].l+==tree[x].r)
return;
if(tree[x].cov>=)
tree[x*].cov=tree[x*+].cov=tree[x].cov;
} void build(int x,int l,int r)
{
tree[x].l=l;
tree[x].r=r;
tree[x].cov=;
if(l+<r)
{
int mid=(l+r+)/;
build(x*,l,mid);
build(x*+,mid,r);
}
} void modify(int x,int l,int r,int op)
{
if(l<=tree[x].l&&r>=tree[x].r&&tree[x].cov>=)
{
tree[x].cov+=op;
}
else
{
pushdown(x);
int mid=(tree[x].l+tree[x].r+)/;
if(l<mid)
modify(x*,l,r,op);
if(r>mid)
modify(x*+,l,r,op);
pushup(x);
}
} //扫描线的query可以简略着写,因为一定是全部查询
double query(int x)
{
if(tree[x].cov>=)
return tree[x].len();
else if(tree[x].cov==||tree[x].cov==)
return ;
else
{
pushdown(x);
double ret=;
ret+=query(x*);
ret+=query(x*+);
return ret;
}
} int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
int n;
scanf("%d",&n);
for(int i=;i<n*;i++)
{
scanf("%lf",a+i);
t[i]=a[i];
}
sort(t,t+n*);
int m=unique(t,t+n*)-t;//编号1..m
for(int i=;i<n*;i++)
{
b[i+]=lower_bound(t,t+m,a[i])-t+;
to[b[i+]]=a[i];
} for(int i=,j=;i<=n*;i+=,j+=)
{
seg[j]=(tseg){b[i],b[i+],b[i+],};
seg[j+]=(tseg){b[i],b[i+],b[i+],-};
}
sort(seg+,seg++n*); build(,,m);
double ans=;
for(int i=;i<=n*;i++)
{
if(i>=)
{
double len=query();
ans+=len*(to[seg[i].y]-to[seg[i-].y]);
}
modify(,seg[i].x1,seg[i].x2,seg[i].flag);
} printf("%.2f\n",ans);
}
return ;
}

hdu 1255 覆盖的面积 (扫描线求矩形交)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. HDU - 1255 覆盖的面积 (线段树求面积交)

    https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...

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

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

  9. HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)

    题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...

随机推荐

  1. .NET做人脸识别并分类

    .NET做人脸识别并分类 在游乐场.玻璃天桥.滑雪场等娱乐场所,经常能看到有摄影师在拍照片,令这些经营者发愁的一件事就是照片太多了,客户在成千上万张照片中找到自己可不是件容易的事.在一次游玩等活动或家 ...

  2. Vue学习笔记:Vuex

    为什么需要Vuex 管理共享状态 解决一份数据在多个组件中试用的困难 系统化的状态管理,区别于小型状态过来 底层设计模式: 全局单例模式 应用场景 适合中大型项目: 小项目反而会因为引入更多概念和框架 ...

  3. mac软件推荐及chrome插件推荐

    通用软件 Alfred (超级好用的效率工具) 用mac这个软件一定要装,用习惯之后加上电脑本身的快捷键.效率提升的飞起. Alfred我常使用的功能有: 搜索chrome的书签 我搜索的书签大概分为 ...

  4. 20191121-7 Scrum立会报告+燃尽图 03

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/10067一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  5. 基于loghub的消息消费延迟监控

    我们可以把loghub当作一个消息中间件来使用.如果能知道当前的消费进度,自然好了,否则消费情况一无所知,总是有点慌! loghub消费分两种情况,一是普通消费,二是消费组消费: 消费组消费,logh ...

  6. Reactor和Proactor模型

    背景 前面介绍了I/O多路复用模型,那有了I/O复用,有了epoll已经可以使服务器并发几十万连接的同时,还能维持比较高的TPS,难道还不够吗?比如现在在使用epoll的时候一般都是起个任务,不断的去 ...

  7. 记一次uboot中gunzip解压速度慢的问题排查

    背景 在项目中需要用到解压功能,之前还记录了下,将uboot解压代码移植到另外的bootloader中时,碰到的效率问题.最终查明是cache的配置导致的. https://www.cnblogs.c ...

  8. xpath选择兄弟节点、返回上一级和选择多个属性

    本文链接:https://blog.csdn.net/ZincZhang/article/details/80248297选择兄弟节点选择前N位的div标签 preceding-sibling::di ...

  9. Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    背景 因为公司一个app项目需要扩展,因为功能较多且较完整的流程与业务,而且和以前的业务关系不大,所以我整合到了 另外一个分包中(代号:newFunc,请注意是代号)进行依赖. 当我写完这部分业务开始 ...

  10. C # socket 实例

    同步客户端存储示例 下面的示例程序创建连接到服务器的客户端.             客户端使用一个同步套接字生成,因此,客户端应用程序的执行挂起,直到服务器返回响应.  应用程序将字符串发送到服务器 ...