重点整理面积并的思想 以及PushUp的及时更新 还有就是cover的实现 以及建树每个节点存的信息(每个节点存的是一个线段的信息)

http://www.tuicool.com/articles/6Zf6J3 大致思想

再就是 得注意线段树维护的信息是什么

如图所示 一个点维护的是一段线段的长度

然后在对浮点数建树的时候 得用上离散化的思想

#include<cstdio>
#include<string.h>
#include<iostream>
#define maxn 10005
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#include<algorithm>
using namespace std;
struct
node//区分线段树节点的值 以及线段树需要维护的值
{
double
x1,x2,y;
int
c;
node(double x1=,double x2=,double y=,int c=):x1(x1),x2(x2),y(y),c(c){}//自定义函数 用来初始化赋值
bool
friend operator<(node a,node b)
{

return
a.y<b.y;
}
};

double
sum2[maxn<<],sum1[maxn<<];
int
cover[maxn<<];//用来表示该段完全覆盖的次数
double
x[maxn<<];
void
Pushup(int rt,int l,int r)//cover表示的是一个区间完全覆盖的次数 注意 是完全覆盖!
{

if
(cover[rt]>=) sum2[rt]=x[r]-x[l-],sum1[rt]=x[r]-x[l-];//当覆盖超过两次的时候 满足条件 直接计算
else

{

if
(cover[rt]==)
{

sum1[rt]=x[r]-x[l-];
if
(l==r) sum2[rt]=;
else
sum2[rt]=sum1[rt<<]+sum1[rt<<|];// 在确定这段已经完全覆盖的一次的时候 要看子段是否有覆盖一次的 有的话 加起来就是两次了
}

else
if
(l==r) sum2[rt]=,sum1[rt]=;
else
sum1[rt]=sum1[rt<<]+sum1[rt<<|],sum2[rt]=sum2[rt<<]+sum2[rt<<|];// 这段确定一次都没有完全覆盖的时候 看子段是否有覆盖的情况
}
}

void
build(int l,int r,int rt)
{

cover[rt]=;
if
(l==r)
{

sum1[rt]=;
sum2[rt]=;
return
;
}

int
m=(l+r)/;
build(lson);
build(rson);
Pushup(rt,l,r);
}

void
updata(int l,int r,int rt,int L,int R,int c)
{

if
(L<=l&&r<=R)
{

cover[rt]+=c;
Pushup(rt,l,r);
return
;
}

int
m=(l+r)/;
if
(L<=m) updata(lson,L,R,c);
if
(R>m) updata(rson,L,R,c);
Pushup(rt,l,r);
}

int
main()
{

int
n,Case=,t;
node stu[maxn<<];
cin>>t;
while
(t--)
{

scanf("%d",&n);
for
(int i=;i<n;i++)
{

double
x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
stu[i*]=node(x1,x2,y1,);//底边为1 //扫描的时候 用来更改cover的值
stu[i*+]=node(x1,x2,y2,-);//顶边为-1
x[i*]=x1,x[i*+]=x2;
}

sort(x,x+*n);/离散化第一步 排序
int
nn=unique(x,x+*n)-x;//第二步 去重
build(,nn,);
sort(stu,stu+*n);//按高度递增排序
double
ans=;
        for(int i=;i<*n-;i++)
{

int
l=lower_bound(x,x+nn,stu[i].x1)-x+;//二分是要在去重之后的长度进行的
int r=lower_bound(x,x+nn,stu[i].x2)-x;
updata(,nn,,l,r,stu[i].c);
ans+=(stu[i+].y-stu[i].y)*sum2[]; //当 stu[i+1].y-stu[i].y 的值不为0的时候 说明一层统计结束 sum【1】表示这层总线段长度
        } printf("%.2lf\n",ans); } return; }

 

												

线段树 面积并问题 hdu 1255 1542的更多相关文章

  1. 线段树->面积并 Atlantis HDU - 1542

    题目链接:https://cn.vjudge.net/problem/HDU-1542 题目大意:求面积并 具体思路:我们首先把矩形分割成一横条一横条的,然后对于每一个我们给定的矩形,我们将储存两个点 ...

  2. HDU 1255 覆盖的面积(线段树面积并)

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

  3. HDU 1542 Atlantis(线段树面积并)

     描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...

  4. hdu 1255 覆盖的面积(线段树 面积 交) (待整理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   In ...

  5. POJ 1542 Atlantis(线段树 面积 并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...

  6. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  7. 【HDU4419 Colourful Rectangle】 线段树面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜 ...

  8. POJ 1389 Area of Simple Polygons 扫描线+线段树面积并

    ---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...

  9. 线段树练习[单点更新] HDU 2795 Billboard

    题目大意:有一个h*w的公告榜,可以依次在上面添加信息.每个信息的长度为x,高为1. 优先在最上面加入,如果空间足够的话,然后优先放在最左面.统计每条公告最终的位置,即它所在的行数. 这里是线段树来存 ...

随机推荐

  1. T-MAX——项目需求分析

    这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第二次-需求规格说明书 团队名称 T-MAX 这个作业的目标 撰写项目需求规格说明书,介绍团队分工 作业正文 T-MA ...

  2. opencv 检测人脸、人眼

    This tutorial code’s is shown lines below. You can also download it from here . The second version ( ...

  3. java 获取String中的数字

    随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取出来呢?大致有以下几种方法, ...

  4. 算法习题---4-5IP网络(Uva1590)

    一:题目 给出m(1到10000之间)个IP地址,求他们最小的网络号和子网掩码 (一)样例输入 3 表示要获取的IP地址个数 194.85.160.177 IP地址 194.85.160.183 19 ...

  5. 算法习题---3.11换抵挡装置(UVa1588)

    一:题目 给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度 二:实现思路 1.获取主动轮和从动轮的数据. 2.主动轮不动,从动轮从左 ...

  6. Django之model.form创建select标签

    前言 之前我们学习了form表单验证用户输入格式和自动创建HTML,那么如果用户创建select标签时怎么办呢,先来看下这个东西: models.py 数据格式: class UserInfo(mod ...

  7. 基于pythonselect.select模块通信的实例讲解

    基于python select.select模块通信的实例讲解 要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值. select()方法接收并监控3个通信列表, 第一 ...

  8. Page.ClientScript、ClientScript、ScriptManager、ClientScriptManager等的详细解说

    在 .aspx.cs页面中,输入这四个东西:Page.ClientScript.ClientScript.ScriptManager.ClientScriptManager,均会出提示,表示它们均可用 ...

  9. iOS-UIScrollView滚动视图(转)

    http://blog.csdn.net/iukey/article/details/7319314 UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 CGRect bou ...

  10. Unity与Android刘海屏适配

    本周学习Unity与Android刘海屏适配 关于刘海屏适配部分 网上有很多教程 这里只是做一下整理 https://blog.csdn.net/xj1009420846/article/detail ...