重点整理面积并的思想 以及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. Windows平台下Java,tomcat安装与环境配置

    问题描述:在Windows下面做Java web相关的项目的时候,Java和tomcat是基础,这里记载一下Java环境的配置以及tomcat的安装和配置. 使用工具:Windows.jdk安装包.t ...

  2. php手记之01-tp5框架安装

    1.1.介绍 在web领域,PHP是所有编程语言中比较受欢迎的一门语言! PHP已经诞生出几十种编程框架!但国内最热门和使用率最好的框架有Thinkphp和Laravel这两款PHP框架! 1.2.为 ...

  3. linux下 安装 ImageMagick 及其 php imagick扩展(转)

    linux下 安装 ImageMagick 及其 php imagick扩展 PHP版本7.1.3 : ImageMagick版本 ImageMagick-7.0.8-3: PHP扩展imagick版 ...

  4. <JavaScript>constructor、prototype、__proto__和原型链

    在看了网上很多相关的文章,很多都是懵逼看完,并不是说各位前辈们写得不好,而是说实在不容易在一两次阅读中理解透.我在阅读了一些文章后,自己整理总结和绘制了一些相关的图,个人认为会更容易接受和理解,所以分 ...

  5. [webpack]手写一个mvp版本的webpack

    let fs = require('fs'); let path = require('path'); let babylon = require('babylon'); // Babylon 把源码 ...

  6. osg::NodeVisitor

    [1]osg::Group [2]osg::PositionAttitudeTransform [2]osg::MatrixTransform [3]osg::Geode [2]osg::Matrix ...

  7. 123457123457#1#-----com.threeapp.ErTongHuaXue01----儿童滑雪大冒险

    123456123456#0#-----com.threeapp.ErTongHuaXue01----儿童滑雪大冒险

  8. (十八)Centos之firewall 防火墙命令

    如果你的系统上没有安装使用命令安装 #yum install firewalld  //安装firewalld 防火墙 开启服务 # systemctl start firewalld.service ...

  9. 一个区分度很大的iOS面试题

    @property 后面可以有哪些修饰符?@property中有哪些属性关键字? 属性可以拥有的特质分为四类: 原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确 ...

  10. 高级UI-符合MD的常用控件

    在Google提供的控件中,在support-design及v4,v7包中,存在着很多符合MD标准的控件,这里罗列出一些常用的控件 TextInputLayout 这个控件在作为输入框的时候是极其方便 ...