题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255

求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1次的长度变量即可

代码:

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
class node
{
public:
int l,r;
int c;
double cnt;
double more ;//表示被覆盖次数大于一次的长度
double lf,rf;
};
node segTree[maxn*];
class line
{
public:
double x,y1,y2;
int f;
};
line le[maxn*];
bool cmp(line a, line b)
{
return a.x< b.x;
}
double y[maxn*]; void build(int num,int l, int r)
{
segTree[num].l=l;
segTree[num].r=r;
segTree[num].cnt=;
segTree[num].more==;
segTree[num].lf=y[l];
segTree[num].rf=y[r];
if(l+==r) return;
int mid=(l+r)/;
build(num*,l,mid);
build(num*+,mid,r); } void calen(int num)
{
if(segTree[num].c >=)
{
segTree[num].more=segTree[num].cnt=segTree[num].rf-segTree[num].lf;
return ;
}
else if(segTree[num].c==)
{
segTree[num].cnt=segTree[num].rf-segTree[num].lf;
if(segTree[num].l+ ==segTree[num].r) segTree[num].more=;
else segTree[num].more=segTree[num*].cnt+segTree[num*+].cnt;
}
else
{
if(segTree[num].l+ ==segTree[num].r )
{
segTree[num].cnt=segTree[num].more=;
}
else
{
segTree[num].cnt=segTree[num*].cnt+segTree[num*+].cnt;
segTree[num].more=segTree[num*].more+segTree[num*+].more;
}
}
}
void update(int num, line e)
{
if(e.y1 == segTree[num].lf && e.y2==segTree[num].rf)
{
segTree[num].c+=e.f;
calen(num);
return ;
}
if(e.y2 <= segTree[num*].rf) update(num*,e);
else if(e.y1 >= segTree[num*+].lf) update(num*+,e);
else
{
line temp=e;
temp.y2=segTree[num*].rf;
update(num*,temp);
temp=e;
temp.y1=segTree[num*+].lf;
update(num*+,temp);
}
calen(num);
}
int main()
{
int t;
int n;
double x1,x2,y1,y2; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int num=;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
le[num].x=x1;
le[num].y1=y1;
le[num].y2=y2;
le[num].f=;
y[num]=y1;
num++;
le[num].x=x2;
le[num].y1=y1;
le[num].y2=y2;
le[num].f=-;
y[num]=y2;
num++;
}
sort(le+,le+num,cmp);
sort(y+,y+num);
build(,,num-);
update(,le[]);
double ans=;
for(int i=;i<num;i++)
{
ans+=segTree[].more*(le[i].x - le[i-].x);
update(,le[i]);
}
printf("%.2lf\n",ans);
}
return ; }

hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交的更多相关文章

  1. POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)

    题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...

  2. HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...

  3. HDU 1255 覆盖的面积 (线段树+扫描线+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...

  4. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

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

  5. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  6. HDU 1255 覆盖的面积(线段树:扫描线求面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...

  7. poj1151 Atlanis 线段树+离散化求矩形面积的并

    题目链接:http://poj.org/problem?id=1151 很经典的题目,网上有很多模板代码,自己理解了一天,然后很容易就敲出来了... 代码: #include<iostream& ...

  8. POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)

    求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...

  9. POJ 1151 线段树+扫描线(计算矩形面积并)

    前一篇博客有了讲解就不再叙述了 #include<cstdio> #include<cstring> #include<cmath> #include<ios ...

随机推荐

  1. iOS开发之单例模式

    1.概述 单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源. 如果希望系统中某个类的对象只能存在一个,单例模 ...

  2. CDMA sid, nid, bid 含义解释

    copyright@ celldb.cc SID 是系统识别码,每个地级市只有一个sid,是唯一的. NID是网络识别码,由各本地网管理,也就是由地级分公司分配.每个地级市可能有1到3个nid. BI ...

  3. 2017-3-28 JavaScript 基础、语法

    前端三剑客:  html+css+js(html 决定网页上有什么,css决定东西是怎么摆放的,js决定东西的功能) js定义: js是一个脚本语言,需要有宿主文件,它的宿主文件是html文件. js ...

  4. Windbg DUMP分析(原创汇总)

    1. 引入篇 所谓技术分享,其实是一个自我总结和相互学习.不断成长的过程. 考虑到之前原创的文章http://www.cnblogs.com/LoveOfPrince/p/6032523.html&l ...

  5. 初窥DB2之insert语句

    第一种写法 INSERT INTO PERSVALUES (12, 'Harris', 20, 'Sales', 5, 18000, 1000, '1950-1-1') 第二种写法 INSERT IN ...

  6. jQuery控制input不可编辑

    1.开启disabled,是input不可以编辑 $("#id").attr("disabled","disabled"); 2.关闭dis ...

  7. 一个简单用原生js实现的小游戏----FlappyBird

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...

  8. Java内存泄露实例

  9. 性能测试培训:WebSocket协议的接口性能之Jmeter

    性能测试培训:WebSocket协议的接口性能之Jmeter poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开 ...

  10. Python多线程Selenium跨浏览器测试

    前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏 ...