求矩阵的并,也就是要求所有的面积。那可以吧总的图形按照矩阵来切割。使其为一块一块。

输入的时候用坐标表示,这里扫描线从下到上扫描。初始时让下面的边为1,上面的为-1;

用一条先从下面开始想上扫描。遇到更新线段树,加入该条边,为-1时就除去改变。

这样从下到上一遍扫描就可以得到线段的长度。从下到上的过程中,一旦遇到一条边,那就计算他的高度。

高度*长度就是面积。

/*
那叶子节点[l,l]的长度不就变成0,显然这是有问题的
线段树的每一个节点表示一段区间,[l,r]该区间表示LX[r+1]-LX[l]的长度
1___2___3___4___5离散后的状况
1 2 3 4 线段树中的每一个节点
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 1005
double x[maxn<<];
struct seg
{
double l,r,h;
int f;
}s[maxn<<];
struct node
{
int cnt;//cnt表示该区间是否被完全覆盖 如果cnt==1表示被完全覆盖一次
//cnt=0表示为被完全覆盖 但是不代表未覆盖,cnt>1表示被多次完全覆盖
double len;
}tree[maxn*];
bool cmp(seg a,seg b)
{
return a.h<b.h;
}
int find(double val,int l,int r)
{
int left=l,right=r;
int mid;
while(left<=right)
{
mid=(left+right)/;
if(x[mid]==val)
return mid;
else if(x[mid]>val)
right=mid-;
else left=mid+;
}
return -;
}
void build(int l,int r,int rt)
{
if(l==r)
{
tree[rt].cnt=;
tree[rt].len=;
return ;
}
int m=(l+r)/;
build(lson);
build(rson);
}
void getlen(int rt,int l,int r)
{
if(tree[rt].cnt)//如果整一段被覆盖,直接求得长度
{
tree[rt].len=x[r+]-x[l];
}
else if(l==r)//叶子节点
tree[rt].len=;
else //不是叶子但也未整段覆盖,从儿子节点获得
tree[rt].len=tree[rt<<].len+tree[rt<<|].len;
}
void updata(int L,int R,int c,int l,int r,int rt)
{
if(l>=L&&R>=r)
{
tree[rt].cnt+=c;
getlen(rt,l,r);
return ;
}
int m=(l+r)/;
if(m>=L)
updata(L,R,c,lson);
if(R>m)
updata(L,R,c,rson);
getlen(rt,l,r);
}
int main()
{
int n,m,t,i,j,ff=;
double x1,x2,y1,y2;
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
m=;
for(i=;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
s[m].l=x1;s[m].r=x2;s[m].h=y1;s[m].f=;
//下边界
s[m+].l=x1;s[m+].r=x2;s[m+].h=y2;s[m+].f=-;
//上边界
x[m]=x1;
x[m+]=x2;
m=m+;
}
sort(s,s+m,cmp);
sort(x,x+m);
int k=; for(i=;i<m;i++)//去重复
{
if(x[i]!=x[i-])
x[k++]=x[i];
} build(,k-,);
double ans=;
for(i=;i<m;i++)
{
int ll=find(s[i].l,,k-);//二分找位置
int rr=find(s[i].r,,k-)-;//因为这里表示的为线段 不是点。
updata(ll,rr,s[i].f,,k-,);
ans+=(s[i+].h-s[i].h)*tree[].len;
}
printf("Test case #%d\n",++ff);
printf("Total explored area: %.2lf\n\n",ans);
}
}

hdu1542矩阵的并 线段树+扫描线的更多相关文章

  1. hdu1255 矩阵的交 线段树+扫描线

    /* 不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么, 应该是,可以确定,这个区间被完全覆盖了1次, 而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了, 只要加上t[ ...

  2. hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

  3. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. 线段树+扫描线【HDU1542】Atlantis

    Description 给定一些二维空间上的矩形,求它们的面积并. 一道线段树+扫描线的板子题 然而即使我会打了,也不能灵活运用这种算法.QAQ 遇到题还是不太会. 但是这种板子题还是随随便便切的. ...

  5. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  6. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. HDU 6096 String 排序 + 线段树 + 扫描线

    String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...

  9. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

随机推荐

  1. 《至少有那天》——IU

    //<你的意义>中文版 那天冷的让人好想哭 可是我那一天看到了爱情 湖边的薄冰和老树 就在零下七度那一天 你和我牵手 慢慢聊着以前那些童话 可能它们都有些意义吧 是吗 一个吻 一滴眼泪 一 ...

  2. JMeter中返回Json数据的处理方法

    Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...

  3. Apache轻量级性能测试工具

    平时工作中会需要一些性能测试,简单的性能测试完全可以由AB来替代,而不需要动用LR这样重量级的工具. 此文简单介绍一下ab的工具使用与结果分析.当作个笔记,以便以后查阅. 1.安装:要使用AB,需要先 ...

  4. android studio 导入工程问题总结

    github上下了几个开源项目,在导入android studio时出现各种问题, 在网上查询各种资料后一一得以解决,现对个问题点进行简单的总结: 1. gradle project sync fai ...

  5. Lua笔记(1)

    今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[  .......  --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...

  6. 判断变量是否为json对象

    var m ={a:'A'}; if(typeof m == 'object' && JSON.stringify(m).indexOf('{') == 0){//判断变量m是不是js ...

  7. java中的单引号和双引号

    1.单引号引的数据 是char类型的,双引号引的数据 是String类型的:单引号只能引一个字符,而双引号可以引0个及其以上.char只是一个基本类型,而String 可以是一个类,可以直接引用.比如 ...

  8. xcode插件XAlign

    一款十分强大的自定义对齐模式插件 开源地址:https://github.com/qfish/XAlign/ 终端输入命令: $ curl http://qfi.sh/XAlign/build/ins ...

  9. 普通请求和ajax请求的区别

    普通请求和ajax请求的区别? 下面的action返回一个json文件,文件内容为sts.*,data1

  10. f2fs解析(十)nid 如何从nat_root中删除

    上面我们谈到了一个nid如何从free_nid中转移到node_info中去[分别有一个链表和一棵基数树搭伙做事],讲free_nid时,详细说明了free_nid中是如何进如何出的,上一篇说了nid ...