经典题,线段树扫描线其实类似区间更新,一般的做法是想象一根扫描线从上扫到下或者从左扫到右,本题的做法是从上扫到下

只要扫到了一根水平线,就将其更新到线段树对应区间中,区间和它的子区间是独立更新的

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 2000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
struct Seg{
double l,r,h;
int d;
Seg(){}
Seg(double a,double b,double c,int dd):l(a),r(b),h(c),d(dd){}
bool operator<(const Seg & a)const{
return h<a.h;
}//从下往上扫描
}segs[maxn];//横线段
double data[maxn];
int tot,m;//data统计高度
int cnt[maxn<<];//覆盖了这一整个区间的入边数 - 覆盖了这一整个区间的出边数
double sum[maxn<<];//区间当前被覆盖的长度
inline void pushup(int l,int r,int rt){
//前两个if对应的是update中(L<=l && R>=r)的pushup,后一个if对应的是分开更新后的update
if(cnt[rt])//如果这个区间都被覆盖了
sum[rt]=data[r+]-data[l];
else if (l==r)//如果是单位段并且cnt[rt]==0,说明这一段就是没有被覆盖
sum[rt]=;
else sum[rt]=sum[rt<<]+sum[rt<<|];
}
//更新函数update:如果整个区间被更新,分三种情况:1.这个区间被完全覆盖 2.这个区间是空白单位区间(没有子区间) 3.这个区间没有被完全覆盖
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
cnt[rt]+=c;
pushup(l,r,rt);//为什么这里也会有pushup?因为pushup的功能不只是合并两个区间而已,它还能计算这个区间的覆盖长度
return;
}
int m=l+r>>;
if(L<=m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(l,r,rt);
}
void init(){
tot=m=;
memset(cnt,,sizeof cnt);
memset(sum,,sizeof sum);
}
int main(){
int T=,n;
while(scanf("%d",&n) && n){
init(); for(int i=;i<=n;i++){
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
segs[tot]=Seg(x1,x2,y1,);data[tot++]=x1;
segs[tot]=Seg(x1,x2,y2,-);data[tot++]=x2;
}
sort(segs,segs+tot);
sort(data,data+tot);
m=unique(data,data+tot)-data; double ret=;
for(int i=;i<tot;i++){
int posl=lower_bound(data,data+m,segs[i].l)-data;
int posr=lower_bound(data,data+m,segs[i].r)-data-;
if(posl<=posr)
update(posl,posr,segs[i].d,,m,);//把这条边更新到线段树中
ret+=sum[]*(segs[i+].h-segs[i].h);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++T , ret);
}
return ;
}

poj1511,线段树扫描线面积的更多相关文章

  1. HDU 1255 覆盖的面积 (线段树扫描线+面积交)

    自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了  题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...

  2. HDU 3265 Posters (线段树+扫描线)(面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩 ...

  3. [USACO18JAN] Lifeguards S (线段树:扫描线面积)

    扫描线裸题没什么好说的 注意空间不要开小了!!! #include <cstdio> #include <cstring> #include <algorithm> ...

  4. hdu 3265 Posters(线段树+扫描线+面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 题意:给你一张挖了洞的墙纸贴在墙上,问你总面积有多少. 挖了洞后其实就是多了几个矩形墙纸,一张墙 ...

  5. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

  6. hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

  7. hdu1255 覆盖的面积 线段树-扫描线

    矩形面积并 线段树-扫描线裸题 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...

  8. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  9. 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提

    给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...

随机推荐

  1. div无法触发blur事件解决办法

    默认情况下div无法获取焦点,无法触发focus与blur事件,猜测span,a等标签也无法触发焦点事件(input:button,及button标签可以触发) 如何使div触发blur事件:可以给d ...

  2. python---redis中文操作与系统中文检测

    import redis import chardet r.set("name","我是在Py3保存的中文字符串") ret = r.get("nam ...

  3. mysql名词解释

    什么是QPS? 单位时间内所处理的事务数 什么是TPS? 单位时间内所处理的查询数 响应时间 并发量 同时处理的查询请求的数量 什么是吞吐量?

  4. zabbix微信预警出现的问题

    系统环境:centos7.3 zabbix_server: 3.0.3 3.0.6 问题描述 zabbix预警突然不能发送微信,需要修复 排查步骤 1. 检查微信企业平台应用的key是否过期,结果没过 ...

  5. 神级程序员通过两句话带你完全掌握Python最难知识点——元类!

    千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生 ...

  6. Python基础-day02

    写在前面 上课第二天,打卡: 大人不华,君子务实. 一.进制相关 - 进制基础 数据存储在磁盘上或者内存中,都是以0.1形式存在的:即是以 二进制 的形式存在: 为了存储和展示,人们陆续扩展了数据的表 ...

  7. STM32Cube自学-1

    为了方便调试,使用Keil5+Proteus.1.新建Proteus STM32项目,选择STMF103C6 2.新建STM32CubeMX项目,选择同型号CPU,选择UART1,Asynchrono ...

  8. Table Dragger - 简单的 JS 拖放排序表格插件

    Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...

  9. Java 连接 SqlServer工具类

    1.下载 server2008R2驱动jar包 下载jar包 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=21599 2. ...

  10. Python字符串解析方法汇总

    Python字符串方法解析 1.capitalize 将首字母大写,其余的变成小写 print('text'.capitalize()) print('tExt'.capitalize()) 结果: ...