线段树 面积并问题 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. 优先在最上面加入,如果空间足够的话,然后优先放在最左面.统计每条公告最终的位置,即它所在的行数. 这里是线段树来存 ...
随机推荐
- Nginx配置信息损毁又无备份时如何恢复
worker_processes *; 本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息. 问题背景 假设 /etc/nginx/site-av ...
- requests与urllib.request
requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_06-方法授权-方法授权测试-无权限异常处理
现在没权限返回的信息 控制台抛出的异常是这个 : 不允许访问,这是Spring Security跑出来的 我们在异常处理器里面打个断点看一下 重新测试,就跳转到了异常捕获类这里. 这是异常的类型 这里 ...
- pyecharts绘画优美图形
常用图形:柱形图-折线图-饼图-散点图 from pyecharts import Line, Bar, Pie, EffectScatter # 数据 attr =["衬衫", ...
- Delphi下Treeview控件基于节点编号的访问1
有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下: function GetGlobeNumCode(inNode:T ...
- FastCGI模式下安装Xcache
PHP执行的时候,会被编译成opcode,然后 zend引擎会执行opcode.也就是说,如果你两次执行同一个php程序,每次执行,他都要把php代码编译成opcodexcache的意义在于,当你第一 ...
- DB2学习笔记备忘 2018.5.9
DB2安装的时候选择了和系统用户一致的选项,然后登陆的时候,连接的时候输入的就是计算机用户的用户名和密码. 1.3 DB2数据库体系结构 系统 一个系统表示DB2的一个安装.在一个由很多及其组成的网络 ...
- Docker容器中用户权限管理
在Linux系统中有一部分知识非常重要,就是关于权限的管理控制:Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通 ...
- linux SSH 隧道
一 什么是SSH隧道 首 先看下面这张图,我们所面临的大部分情况都和它类似.我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连 接着你和路由器,但是在我们的 ...
- PL/SQL链接Oracle数据库 导出表结构和表数据
打开pl/sql客户端(导出数据表结构) 在左侧 点击tabales 2 Tools-->Export User Objects,导出sql格式的文件 3 红色1 是你要选择导出的表,红色2 是 ...