线段树 面积并问题 hdu 1255 1542
重点整理面积并的思想 以及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的更多相关文章
- 线段树->面积并 Atlantis HDU - 1542
题目链接:https://cn.vjudge.net/problem/HDU-1542 题目大意:求面积并 具体思路:我们首先把矩形分割成一横条一横条的,然后对于每一个我们给定的矩形,我们将储存两个点 ...
- HDU 1255 覆盖的面积(线段树面积并)
描述 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正 ...
- HDU 1542 Atlantis(线段树面积并)
描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- POJ 1542 Atlantis(线段树 面积 并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 【HDU4419 Colourful Rectangle】 线段树面积并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜 ...
- POJ 1389 Area of Simple Polygons 扫描线+线段树面积并
---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...
- 线段树练习[单点更新] HDU 2795 Billboard
题目大意:有一个h*w的公告榜,可以依次在上面添加信息.每个信息的长度为x,高为1. 优先在最上面加入,如果空间足够的话,然后优先放在最左面.统计每条公告最终的位置,即它所在的行数. 这里是线段树来存 ...
随机推荐
- docker pull 失败: server misbehaving
在docker pull 镜像时一直报错: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lo ...
- vue 实现返回上一页不请求数据keep-alive
常规操作: 我们通常会将通过接口请求数据的方法放在==created== 或者 ==mounted==这两个生命周期中的一个里面调用. 但是我们知道,不管是我们刚进入这个页面还是从其他页面返回这个页面 ...
- List三个子类的特点
List的三个子类的特点 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高. Vector: 底层数据结构是数组,查询快,增删慢. 线程安全,效率低. Vector相对A ...
- HTML5 地理位置定位API(4)
地理定位(geolocation)是最令人兴奋,而且得到了广泛支持的一个新API.通过这套API, JavaScript代码能够访问到用户的 当前位置信息.当然,访问之前必须得到用户的明确许可,即同意 ...
- Javescript——数据类型
原文链接:Understanding Data Types in JavaScript Data types are used to classify one particular type of d ...
- Zabbix4.x 历史数据存储到Elasticsearch7.x
一.简介 Zabbix 3.4.6 版本开始支持历史数据存储到 Elasticsearch, 早就想测试这个功能,最近有个需求需保存 zabbix 的历史数据上达十亿条,因此决定测试这功能的实用性,事 ...
- laravel console handle 传参方法
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Libs\wxpay\CLogFile ...
- PostgreSQL学习笔记——窗口函数
在学习窗口函数之前,我们新建一个Product表并往其中插入一些数据: drop table if exists Product; create table Product ( product_id ...
- javascript——URI的编解码方法
有效的URI(统一资源标示符)是不能包含某些字符的,如空格,所以需要进行编码,编码方法有:encodeURI()和encodeURIComponent(), 对编的码进行解码方法有:decodeURI ...
- JQ操作select项
jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Se ...