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就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
随机推荐
- i7-9700也能安装Windows7
商家说,i7-8700以上不支持Win7,只能安装Win10.我在手机网上也看过同样的说明,是微软与Intel联合行动,意在强迫用户升级到Win10.文章后面有,并不是不能装win7,是没有提供win ...
- window系统下删除多余的引导
window系统下删除多余的引导 1.首先第一步进入EFI分区删除多余系统引导,只留下需要的引导 如何进入EFI分区 a)win 搜索框输入cm, 右键以管理员运行命令行 b)输入命令 diskpar ...
- opencv resize图片为正方形尺寸
在深度学习中,模型的输入size通常是正方形尺寸的,比如300 x 300这样.直接resize的话,会把图像拉的变形.通常我们希望resize以后仍然保持图片的宽高比. 例如: 如果直接resize ...
- 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了
一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...
- 原生JS通过类名(className)获取dom元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Identityserver4配置证书
IS4中如果token的类型是JWT,则需要使用RS256算法生成非对称签名,这意味着必须使用私钥来签名JWT token,并且必须使用对应的公钥来验证token签名,即验证token是否有效.使用R ...
- Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)
1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 4066 通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...
- C# delegate和C# event
在基于Windows平台的程序设计中,事件(event)是一个很重要的概念.因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮.处理Windows系统消息等,这些异步调 ...
- c语言I博客专业04
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8655 我在 ...
- ThinkPHP5入门(基础篇)
ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,自2006年诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,尤其注重开发体验和易用性,并且拥有众多的 ...