hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7985 Accepted Submission(s): 4038

注意:本题的输入数据较多,推荐使用scanf读入数据.
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
题目大意:
求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 覆盖的面积 (扫描线求矩形交)的更多相关文章
- HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
了校赛,还有什么途径可以申请加入ACM校队? 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- HDU - 1255 覆盖的面积 (线段树求面积交)
https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)
题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
随机推荐
- 用例图浅谈以及OOA再到情景分析的面向对象电梯的设计(慕课东北大学)面向对象设计思维模式
上班初期还不太适应,平时学习进度也跟不上,节奏慢下来会有时间更新的了. Diagram 这边以学生课程报名系统为例 这就是一种简单的用例图 用例图可以给读者提供的信息非常丰富,但是缺点是都是概 ...
- 【前端知识体系-JS相关】10分钟搞定JavaScript正则表达式高频考点
1.正则表达式基础 1.1 创建正则表达式 1.1.1 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 1.1.2 调用RegExp对象的构 ...
- 记一次Pod中java进程内存“异常”消耗
背景 环境:openshift3.11 开发反映部署在容器中的java应用内存持续增长,只升不降,具体为: java应用部署在容器中,配置的jvm参数为-Xms1024m -Xmx1024m,容器me ...
- ArcGIS Server10.4安装教程
准备内容 安装环境:win10*64位专业版 安装文件:ArcGIS_Server_Ent_Windows_1041_150998.iso 破解文件:Lic10.4.1.ecp #安装Server前, ...
- 详解 PHP 中的三大经典模式
单例模式 单例模式的含义: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式 ...
- scrapy自动抓取蛋壳公寓最新房源信息并存入sql数据库
利用scrapy抓取蛋壳公寓上的房源信息,以北京市为例,目标url:https://www.dankegongyu.com/room/bj 思路分析 每次更新最新消息,都是在第一页上显示,因此考虑隔一 ...
- 转载-FileZilla Server源码分析(1)
FileZilla Server源码分析(1) 分类: VC 2012-03-27 17:32 2363人阅读 评论(0) 收藏 举报 serversocketftp服务器usersockets工作 ...
- js前端数据验证JS工具
var regexEnum = { intege : "^-?[1-9]\\d*$", // 整数 intege1 : "^[1-9]\\d*$", // 正整 ...
- 生活小插曲(长篇连载,持续更新ing)^_^
这个帖子,长期记录一些小小的生活插曲 在北京朋友开店了-关于同学开快餐店的故事.今天下午听说这个朋友在附近开了一个店,下午5点多吧,出门去他那里去了.走路过去的.在那里聊了将近一个小时吧.对最近我们自 ...
- 配置aria2
Mac 用户肯定都受够了百度网盘在自己电脑上的糟糕体验,至少我是如此:安装官方的 App,经常下载时中断,有时甚至 Bug 般连续中断,无奈使用浏览器下载,速度却是令人挠头.花点时间来配置 aria2 ...