【HDU1542】Atlantis
题意
给出n个矩形的左下角和右上角的坐标,计算总的面积(相交部分只算一次)。
分析
线段树扫描线的模板题。
将每个矩形都拆成上下两条线段,然后从下网上扫,当遇到底边时就加上这个区间,遇到顶边时,就减去这个区间。这些都很好理解,但是有一个点我感觉很难受!对于普通线段树,先将区间[1,2]+1,再更新区间[2,3]+1的话,2这个点的值应该是2。但是扫描线来说,2应该是1。因为[1,3]是一条线。我们的解决办法是,在线段树[L,R]的区间内储存[L,R+1]的值。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn=;
struct Node{
double l,r,h;
int state;
bool operator <(const Node & rhs)const{
return h<rhs.h;
}
Node (){}
Node (double l,double r,double h,int state):l(l),r(r),h(h),state(state){}
}node[maxn];
double v[maxn];
int n,kase;
double x1,y1,x2,y2,ans;
double sumv[*maxn];
int cover[*maxn]; void maintain(int o,int L,int R){
if(cover[o])
sumv[o]=v[R+]-v[L];
else if(L==R)
sumv[o]=;
else
sumv[o]=sumv[*o]+sumv[*o+];
}
int ql,qr,vv;
void update(int o,int L,int R){
if(ql<=L&&qr>=R){
cover[o]+=vv;
maintain(o,L,R);
return ;
}
int M=L+(R-L)/;
if(ql<=M)update(*o,L,M);
if(qr>M)update(*o+,M+,R);
maintain(o,L,R);
}
int main(){
kase=;
while(scanf("%d",&n)!=EOF&&n){
int sz=;
++kase;
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
node[++sz].l=x1,node[sz].r=x2,node[sz].h=y1,node[sz].state=,v[sz]=x1;
node[++sz].l=x1,node[sz].r=x2,node[sz].h=y2,node[sz].state=-,v[sz]=x2;
}
sort(node+,node++sz);
sort(v+,v++sz);
int N=unique(v+,v++sz)-v-;
memset(sumv,,sizeof(sumv));
memset(cover,,sizeof(cover));
ans=;
for(int i=;i<sz;i++){
ql=lower_bound(v+,v++N,node[i].l)-v,qr=lower_bound(v+,v++N,node[i].r)-v-,vv=node[i].state;
update(,,N);
ans+=sumv[]*(node[i+].h-node[i].h);
}
printf("Test case #%d\n",kase);
printf("Total explored area: %.2f\n",ans);
printf("\n");
}
return ;
}
【HDU1542】Atlantis的更多相关文章
- 线段树+扫描线【HDU1542】Atlantis
Description 给定一些二维空间上的矩形,求它们的面积并. 一道线段树+扫描线的板子题 然而即使我会打了,也不能灵活运用这种算法.QAQ 遇到题还是不太会. 但是这种板子题还是随随便便切的. ...
- 【HDU1542】Atlantis (扫描线的经典运用)
点此看题面 大致题意: 给你\(N\)个矩形,请你求出它们覆盖的面积(重叠的面积只算一次). 扫描线 这道题是一道典型的求矩形面积并问题,是扫描线的一个经典运用.这里就不赘述了. 代码 #includ ...
- 【POJ1151】Atlantis(线段树,扫描线)
[POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...
- 【POJ1151】Atlantis
题目大意:给定 N 个矩形,求这些矩形的面积并. 题解:采用扫描线算法. 首先,按照矩形的横坐标排序,在纵坐标方向上维护一根扫描线被覆盖的长度,在这里采用线段树维护.统计答案时,从左到右扫描 2N 个 ...
- 【hdu1542】线段树求矩形面积并
分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- 【POJ1151】【扫描线+线段树】Atlantis
Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...
- 【42.49%】【hdu 1542】Atlantis(线段树扫描线简析)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...
- SCI&EI 英文PAPER投稿经验【转】
英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...
随机推荐
- CentOS 中安装NFS
NFS(network file system)网络文件系统,类似Windows中的文件夹共享,如下有三台机器A, B, C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些图片分别放到A, ...
- 1G1核1M选择 Centos 32位 还是 Centos 64位?
前几天有个疑惑,现有一台云主机是 1G1核1M使用 Centos 64位会不有点浪费. 还专门发信息询问老大 Karson,老大说现 FastAdmin 都是三个1,也是 64 位的. 看 FastA ...
- hadoop之 Hadoop2.2.0中HDFS的高可用性实现原理
在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障 ...
- Web 漏洞分析与防御之点击劫持(三)
原文地址:Web 漏洞分析与防御之点击劫持(三) 博客地址:http://www.extlight.com 一.全称 点击劫持,顾名思义,用户点击某个按钮,却触发了不是用户真正意愿的事件. 二.原理 ...
- DBUtils 增删改查例子
sql CREATE TABLE [dbo].[Person] ( , ) NOT NULL , ) COLLATE Chinese_PRC_CI_AS NULL , [age] [int] NULL ...
- 【学习记录】二分查找的C++实现,代码逐步优化
二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值& ...
- 【STL源码学习】std::list类的类型别名分析
有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...
- MySQL的Query Cache原理分析
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC.每个Cache都是以SQL文本作为key来存的. 原理 ...
- 关于硬件实现FFT逆运算
前面的文章我们介绍了关于FFT的硬件实现.关于FFT的逆运算IFFT,其实就是将实现FFT的过程反过来执行就可以了. 在实现过程中要注意很多问题. 同 FFT一样,效率问题.以2048点为例,根据理论 ...
- 【转】利用 Apache JMeter 测试 WebSphere 性能
如果您预算紧张并且时间紧迫 —— 或者即使您不是这样 —— 那么,您可能希望考虑使用 JMeter 来对 Web 和其他应用程序进行压力测试.IBM 的 Greg Herringer 详细描述他使用这 ...