线段树+扫描线【HDU1542】Atlantis
Description
给定一些二维空间上的矩形,求它们的面积并.
一道线段树+扫描线的板子题
然而即使我会打了,也不能灵活运用这种算法。QAQ
遇到题还是不太会.
但是这种板子题还是随随便便切的.
时间特别特别多的话,就练线段树!(flag)
这里放下代码好了,网上讲解有很多.就不写了 qwq
代码
#include<cstdio>
#include<algorithm>
#define ls o<<1
#define rs o<<1|1
#define R register
using namespace std;
struct code
{
double l,r,h;
int f;
bool operator < (const code&a)const
{
return h<a.h;
}
}edge[2008];
struct cod
{
int l,r,s;
double len;
}tr[8888];
double x[2333];
void build(int o,int l,int r)
{
tr[o].l=l,tr[o].r=r;
tr[o].s=0;tr[o].len=0;
if(l==r)return;
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
inline void up(int o)
{
if(tr[o].s)
tr[o].len=x[tr[o].r+1]-x[tr[o].l];
else if(tr[o].l==tr[o].r)
tr[o].len=0;
else tr[o].len=tr[ls].len+tr[rs].len;
}
void change(int o,int l,int r,int del)
{
if(tr[o].l==l && tr[o].r==r)
{
tr[o].s+=del;
up(o);
return;
}
int mid=(tr[o].l+tr[o].r)>>1;
if(r<=mid)change(ls,l,r,del);
else if(l>mid) change(rs,l,r,del);
else change(ls,l,mid,del),change(rs,mid+1,r,del);
up(o);
}
int main()
{
int n,cas=0;
for(;;)
{
scanf("%d",&n);
if(n==0)break;
int tot=0;
for(R int i=1;i<=n;i++)
{
R double x1,x2,y1,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
edge[++tot].l=x1;edge[tot].r=x2;edge[tot].h=y1;
edge[tot].f=1;x[tot]=x1;
edge[++tot].l=x1;edge[tot].r=x2;edge[tot].h=y2;
edge[tot].f=-1;x[tot]=x2;
}
sort(x+1,x+tot+1);
sort(edge+1,edge+tot+1);
int new_n=1;
for(R int i=2;i<=tot;i++)
if(x[new_n]!=x[i])x[++new_n]=x[i];
build(1,1,new_n);
double ans=0;
for(R int i=1;i<=tot;i++)
{
int l=lower_bound(x+1,x+new_n+1,edge[i].l)-x;
int r=lower_bound(x+1,x+new_n+1,edge[i].r)-x-1;
change(1,l,r,edge[i].f);
ans+=(edge[i+1].h-edge[i].h)*tr[1].len;
}
printf("Test case #%d\n",++cas);
printf("Total explored area: %.2f\n\n",ans);
}
}
线段树+扫描线【HDU1542】Atlantis的更多相关文章
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- Atlantis poj1151 线段树扫描线
Atlantis poj1151 线段树扫描线 题意 题目给了n个矩形,每个矩形给了左下角和右上角的坐标,矩形可能会重叠,求的是矩形最后的面积. 题解思路 这个是我线段树扫描线的第一题,听了学长的讲解 ...
- 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))
扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- 【学习笔记】线段树—扫描线补充 (IC_QQQ)
[学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
随机推荐
- 【题解】HNOI2018寻宝游戏
太厉害啦……感觉看到了正解之后整个人都惊呆了一样.真的很强%%% 首先要注意到一个性质.位运算列与列之间是不会相互影响的,那么我们先观察使一列满足条件的操作序列需要满足什么条件.&0时,不论之 ...
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势: AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...
- at用法小记
By francis_hao Aug 22,2017 at – 设置稍后执行的作业. 概要 at [-V] [-f file] [-mMlv] timespec...at [-V] [-f ...
- git使用笔记(二)分支与合并
By francis_hao Nov 18,2016 查看分支,* 表示当前所在分支 $ git branch 查看分支和最后一次提交记录 $ git branch -v 新建分支 $ git ...
- 如何让spring源码正常的部署在idea中
我在这里把我从GitHub下载的源码成功编译之后的文件放在了我的百度网盘上大家可以直接下载,也可以按如下步骤自己编译部署到idea中, 下载的地址是:http://pan.baidu.com/s/1d ...
- 迅雷Bolt的ClipSubBindBitmap函数特别说明
因为在工作中基于迅雷Bolt开发的是IM产品,需要实现自定义用户头像的功能. 但Bolt中对图像的默认拉伸锯齿效果非常明显,所以自己实现了图像拉伸函数,代码已共享,具体可查看:<迅雷Bolt图像 ...
- 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)
今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下 \s 不支持全角 1.& ...
- 【BZOJ】1782: [Usaco2010 Feb]slowdown 慢慢游
[算法]DFS序+树状数组 [题解]题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和. 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[ ...
- Xcode5根控制器使用xib展示的步骤
#error:Xcode5根控制器使用xib展示,步骤 ⓵取消mainInterface ⓶右击file's owner对xib进行view-view连线,否则: Terminating app du ...
- bzoj 1012 基础线段树
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 今儿一天状态不好,都没怎么刷题..快下课了,刷道水题.... 裸的线段树 /*** ...