线段树 面积并问题 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. 优先在最上面加入,如果空间足够的话,然后优先放在最左面.统计每条公告最终的位置,即它所在的行数. 这里是线段树来存 ...
随机推荐
- OpenJudge计算概论-最大奇数与最小偶数之差的绝对值
/*============================================================= 最大奇数与最小偶数之差的绝对值 总时间限制: 1000ms 内存限制: ...
- 如果你处理的是字节,那么 Go 语言可能是一个不错的选择。 如果你处理的是数据,那么 Go 语言可能不是一个好的选择。
用Go语言编程的利与弊 AI前线小组 译 InfoQ 今天
- LoadRunne遇到的一些问题FAQ(持续更新...)
1.LR11破解完成,添加License失败,报错License security violation Loadrunner11破解成功后,用deletelicense.exe工具把License全删 ...
- 在基于acpi的linux系统上如何检查当前系统是否支持深度睡眠?
答: 执行以下命令: # dmesg|grep -i acpi |grep -i supports (S3表示支持深度睡眠) ACPI: (supports S0 S1 S3 S4 S5)
- vue页面刷新重定向
在App.vue中,添加如下代码: created(){ if(this.$router.path !== '/RealTimeMonitoring'){ this.$router.replace(' ...
- ASP生成JSON数据
原文地址为:ASP生成JSON数据 < %@LANGUAGE = " VBSCRIPT " CODEPAGE = " 65001 " % > ...
- webSphere 部署项目时,访问报错:Error 500: javax.servlet.ServletException: SRVE0207E: Uncaught initialization exception created by servlet【我】
前提: 一个普通maven项目,在本地用Tomcat运行没有任何问题,但是放到 webSphere 测试环境上,访问时就报如下错误: Error 500: javax.servlet.Servlet ...
- python面向对象之花里胡哨大杂烩
python类的魔法方法之__str__.__repr__.__format__.__module__.__class__.__slots__.__call__.__del__(析构函数) 字符串的内 ...
- react中,用key值来解决一些奇葩问题
编辑用户信息,角色信息无法加载到值 改进之后:思路:由于值是设置在state里面的,界面编辑时,会重服务器拉去数据,值也设置在state里面了,但是CheckboxGroup依然不会去渲染选中的值, ...
- 记录:larvel Windows 安装
先安装Composer 不多叙述了 链接: https://pan.baidu.com/s/1sljuImh 密码: qcj3 打开命令窗口 进入你的集成环境 网站根目录下 laravel程序会下载 ...