HDU1255覆盖的面积
覆盖的面积 |
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 30 Accepted Submission(s): 23 |
Problem Description
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.
|
Input
输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.
注意:本题的输入数据较多,推荐使用scanf读入数据. |
Output
对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.
|
Sample Input
2 |
Sample Output
7.63 |
Author
Ignatius.L & weigang Lee
|
Recommend
Ignatius.L
|
/*----------------------------------------------
File: F:\ACM源代码\数据结构--线段树\HDU1255.cpp
Date: 2017/5/30 22:21:39
Author: LyuCheng
----------------------------------------------*/
/*
题意:给你很多矩形,然后让你求出最少覆盖两次的面积 思路:扫描线加一点扩展, 计算面积的时候,忽略覆盖一次的长度,x轴上覆盖超过两次的线段长度*高度
由于我们只需要维护1到max的覆盖长度,所以不需要向下更新,pushup函数,一次维护覆盖过一次的
长度,一次维护覆盖过两次或者以上的长度
*/ #include<bits/stdc++.h> #define N 2222
#define lson i*2,l,m
#define rson i*2+1,m+1,r
using namespace std; struct Node{
double l,r,h;
int d;//左右边界,y坐标,是上边界还是下边界
Node (){}
Node(double _l,double _r,double _h,int _d){l=_l;r=_r;h=_h;d=_d;}
bool operator < (const Node &b) const{
return h<b.h;
}
};
Node node[N*];//每一个矩形都能产生两条边
double X[N*];//一个矩形有两条边,一条边有两个在x轴上的坐标
double sum[N*];//表示覆盖过的长度
double sumd[N*];//表示覆盖过两次的以上的长度
int setd[N*]; void pushupo(int i,int l,int r){//更新覆盖过一次的
if(setd[i]){
sum[i]=X[r+]-X[l];
}else if(l==r){//如果是叶子结点的话,那么覆盖长度是零
sum[i]=;
}else{
sum[i]=sum[i*]+sum[i*+];
}
} void pushupm(int i,int l,int r){//更新覆盖过两次以上的
if(setd[i]>=){//覆盖过两次或者以上了
sumd[i]=X[r+]-X[l];
}else if(l==r){//叶子结点
sumd[i]=;
}else if(setd[i]==){
sumd[i]=sum[i*]+sum[i*+];
}else{
sumd[i]=sumd[i*]+sumd[i*+];
}
} void update(int ql,int qr,int d,int i,int l,int r){ if(ql<=l&&r<=qr){
setd[i]+=d;
pushupo(i,l,r);
pushupm(i,l,r);
return ;
} int m=l+(r-l)/;
if(ql<=m) update(ql,qr,d,lson);
if(m<qr) update(ql,qr,d,rson);
pushupo(i,l,r);
pushupm(i,l,r);
} int Seach(double op,int n){//离散化x坐标为整数,这样才能用线段树维护
int l=,r=n;
while(r>=l){
int m=l+(r-l)/;
if(X[m]==op)
return m;
else if(X[m]>op)
r=m-;
else
l=m+;
}
return -;
} void init(){
memset(sum,,sizeof sum);
memset(sumd,,sizeof sumd);
memset(setd,,sizeof setd);
} int main(){ // freopen("in.txt","r",stdin);
int n;
double x1,x2,y1,y2;
int len=;
int cnt=;
int t;
scanf("%d",&t);
while(t--){
init();
scanf("%d",&n);
len=;cnt=; for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
node[++cnt]=Node(x1,x2,y1,);
node[++cnt]=Node(x1,x2,y2,-);
X[++len]=x1;
X[++len]=x2;
} sort(node+,node+cnt+);
sort(X+,X+len+); int ans=; for(int i=;i<=len;i++)//进行去重操作
if(X[i]!=X[i-])
X[++ans]=X[i]; len=ans;
double cur=;
for(int i=;i<cnt;i++){
int l=Seach(node[i].l,len);
int r=Seach(node[i].r,len)-;
if(l<=r)
update(l,r,node[i].d,,,len);
cur+=sumd[]*(node[i+].h-node[i].h);
}
printf("%.2lf\n",cur);
}
return ;
}
HDU1255覆盖的面积的更多相关文章
- Hdu1255 覆盖的面积
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...
- HDU-1255 覆盖的面积 (扫描线)
题目大意:给若干个矩形,统计重叠次数不为0的面积. 题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可.这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC. ...
- hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...
- HDU-1255 覆盖的面积 覆盖的矩形面积并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 需要保存区间覆盖线>=2的线段的长度,根据情况来更新... //STATUS:C++_AC ...
- hdu1255 覆盖的面积 线段树-扫描线
矩形面积并 线段树-扫描线裸题 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...
- hdu1255 覆盖的面积(线段树面积交)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 面积交与面积并相似相比回了面积并,面积交一定会有思路,当然就是cover标记大于等于两次时. 但 ...
- 覆盖的面积(HDU 1255 线段树)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
随机推荐
- [UIKit学习]02.关于UIButton
按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 按钮也是一种容器,在这一点上跟UIView类似 按钮的三种状态 normal(普通状态) 默认情况(Default) 对 ...
- jdk版本切换
安装1.6/1.7/1.8版本的jdk 保存jdk的安装目录下的文件 卸载所有jdk 将jdk各个版本拷贝到一个文件夹下 配置环境变量 因为安装之后系统会有注册表之类的文件,单纯的修改环境是不会修改成 ...
- .Net Core2.0 + Nginx + CentOS 部署
准备把项目往Linux上迁移,整个流程跑了一下,也遇到无数个坑...以下为亲测并修改后的完整流程... 安装ZIP yum install -y unzip zip Putty:WINDOWS上传文件 ...
- 我的第一个python web开发框架(3)——怎么开始?
小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...
- java从命令行接收多个数字,求和程序分析
问题:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 1.设计思想 (1)声明两个变量接收输入的字符串 (2)将字符串转换成int类型 (3)输出求和 2.程序流程图 3.源程序代码 i ...
- Python 实现的随机森林
随机森林是一个高度灵活的机器学习方法,拥有广泛的应用前景,从市场营销到医疗保健保险. 既可以用来做市场营销模拟的建模,统计客户来源,保留和流失.也可用来预测疾病的风险和病患者的易感性. 随机森林是一个 ...
- 对Java Web项目中路径的理解
第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...
- IOC模式理解
理解IOC inversion of control 控制反转 与 DI Dependency Injection 依赖注入概念之前,我们需要知道在一个系统的设计过程中,降低各模块之间的相 ...
- Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- Asp.Net MVC4 系列--进阶篇之路由 (2)
上一篇介绍了Asp.Net MVC 中,从Http Pipeline上接收到请求如何匹配,匹配限制,以及如何控制在指定命名空间查找,解析出controller和action,并传参. 这篇主要介绍如何 ...