题意

给出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的更多相关文章

  1. 线段树+扫描线【HDU1542】Atlantis

    Description 给定一些二维空间上的矩形,求它们的面积并. 一道线段树+扫描线的板子题 然而即使我会打了,也不能灵活运用这种算法.QAQ 遇到题还是不太会. 但是这种板子题还是随随便便切的. ...

  2. 【HDU1542】Atlantis (扫描线的经典运用)

    点此看题面 大致题意: 给你\(N\)个矩形,请你求出它们覆盖的面积(重叠的面积只算一次). 扫描线 这道题是一道典型的求矩形面积并问题,是扫描线的一个经典运用.这里就不赘述了. 代码 #includ ...

  3. 【POJ1151】Atlantis(线段树,扫描线)

    [POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...

  4. 【POJ1151】Atlantis

    题目大意:给定 N 个矩形,求这些矩形的面积并. 题解:采用扫描线算法. 首先,按照矩形的横坐标排序,在纵坐标方向上维护一根扫描线被覆盖的长度,在这里采用线段树维护.统计答案时,从左到右扫描 2N 个 ...

  5. 【hdu1542】线段树求矩形面积并

    分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...

  6. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  7. 【POJ1151】【扫描线+线段树】Atlantis

    Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...

  8. 【42.49%】【hdu 1542】Atlantis(线段树扫描线简析)

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  9. SCI&EI 英文PAPER投稿经验【转】

    英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...

随机推荐

  1. Cookie Session 和Django分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  2. python-生成测试报告-然后自动发送邮件

    前两篇单独介绍了生成测试报告和自动发送邮件,那么现在把两者整合到一起:生成测试报告后然后自动发送邮件,这里只是简单的整合实现功能,其实还可以优化的,先用吧,后面再慢慢优化 先看下目录,其实目录还是一样 ...

  3. Linux和Windows的遍历目录下所有文件的方法对比

    首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #inclu ...

  4. C语言的补码表示和unsigned及signed的转换

    这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.doub ...

  5. JVM内存管理之JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  6. 关于INTEL FPGA设计工具DSP Builder

    一段时间以来,MathWorks一直主张使用Matlab和Simulink开发工具进行基于模型的设计,因为好的设计技术使您能够在更短的时间内开发更高质量的复杂软件.基于模块的设计采用了数学和可视化的方 ...

  7. (转)SQL server 2005查询数据库表的数量和表的数据量

    本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjec ...

  8. ptyhon中文本挖掘精简版

    import xlrd import jieba import sys import importlib import os #python内置的包,用于进行文件目录操作,我们将会用到os.listd ...

  9. Tomcat的文件列表服务

    今天需要将分析后的日志结果发布到网站上供其他人浏览,虽然用户可以通过直接使用url链接可以访问到对应的文件,但是毕竟还是不方便,没有一个类似文件浏览器的东西,可以直接查看文件夹和文件列表. 其实这样的 ...

  10. 20181104_C#线程之Thread_ThreadPool_使用Thread实现回到和带参数的回调

    C#   .net  Framework多线程演变路径: 1.0    1.1 时代使用Thread 2.0    时代使用ThreadPool 3.0    时代使用Task 4.0    时代使用 ...