【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. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...
随机推荐
- c++中using的使用
#include <iostream> #include <vector> #include <map> using namespace std; //1.相当于t ...
- Linux 之 hugepage 大页内存理论
HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能.尤其是对于8GB以上的内存以 ...
- Oracle 11gR2 RAC集群服务启动与关闭总结
引言:这写篇文章的出处是因为我的一名学生最近在公司搭建RAC集群,但对其启动与关闭的顺序和原理不是特别清晰,我在教学工作中也发现了很多学员对RAC知识了解甚少,因此我在这里就把RAC里面涉及到的最常用 ...
- HDFS(二)
HDFS的I/O主要是三个方面: 一致性 HDFS在一致性上面主要是通过校验和(checksum)来实现:从client发起写入的时候会校验一下文件内容,但是发生在pipeline的最后一个节点的时候 ...
- pat1022__字符串查找
主要是对字符串的查找,为了方便并且快速的实现查找,用map会比较方便 同时如何把一个带有空格的字符串变成多个单词也有一个小技巧 char *point=book[i].keyWord;//关键词分离 ...
- Oracle数据库clob字段导出为sql insert插入语句
oracle数据库的clob字段导出为sql insert插入语句可以分三种情况:1,clob没有换行符:2,clob有换行符但不以分号结尾:3,clob有换行符并且以分号结尾. clob没有换行符使 ...
- 第三方登录之微信登录,基于ThinkSDK
本文基于ThinkSDK,为其补充微信登录demo 增加ThinkSDK的微信第三方登录 阅读本文之前请先了解ThinkSDK的文档 http://www.echomod.com/nexstep/fo ...
- 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)
题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...
- Python与快速排序
这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出. 注:转载请说明出处 问题提出: 将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, ...
- thinkphp5集成微信支付【公众号支付】快捷路径
1 下载官方的测试用例PHP版 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 2 到vendor目录新建weixin文件夹 ...