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就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
随机推荐
- Yum —— CentOS 下包管理工具 学习笔记
环境:CentOS 7 (阿里云服务器) 一.linux 发行版下的包管理阵营 包管理系统 除了方便你安装和管理包之外,还能帮你解决依赖问题. 下面就介绍2个最主要的: 1.Debian 系 - dp ...
- 学习PHP框架只停留在会用层面,职业生涯肯定走不远!
工作这么多年,也面试过很多PHP工程师,我发现很多PHP工程师只停留在使用框架的层面,然而对框架底层根本没有深入去了解,那么这就会给自己的职业生涯带来一定的瓶颈,当遇到问题的时候你就无从下手,不知道如 ...
- D^3ctf两道 pwn
这次 的D^3ctf 又是给吊打 难顶... 所以题都是赛后解出来的,在这感谢Peanuts师傅 unprintableV 看看保护: 看看伪代码,其实代码很少 void __cdecl menu() ...
- vue 原生添加滚动加载更多
vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...
- 继上篇-jquery ajax提交 本篇用ajax提交的数据去数据库查询
上篇讲到如何用jquery ajax提交数据至后台,后台接收并返回给ajax.https://www.cnblogs.com/tiezhuxiong/p/11943328.html 今天我们把数据传到 ...
- .NET高级特性-Emit(2.2)属性
关于Emit的博客已经进入第四篇,在读本篇博文之前,我希望读者能先仔细回顾博主之前所编写的关于Emit的博文,从该篇博文开始,我们就可以真正的使用Emit,并把知识转化为实战,我也会把之前的博文链接放 ...
- 题解 P2669 【金币】
似乎我这个"蒟蒻"跟各位DALAO想的不太一样 首先,输入n,使用一层循环搞定 具体思路: 使用ans作为累加器,k记录发几枚金币,s负责不断赋值给累加器,sum当这些天数的金币发 ...
- Java中的集合(Set,List,Map)
******************collections类总结*************************** JAVA集合主要分为三种类型: Set(集) List(列表) ...
- MYSQL删除
1.使用360卸载,并强力删除相关东东 2.清理注册表: A.HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application ...
- 【Android - 自定义View】之自定义九宫格手势解锁控件
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 LockView ,继承自View类: (2)这个自定义View实现了应用中常见的九宫格手势解锁功能,可以用于保证应用安全: ( ...