链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542

题意:

求所给矩形的覆盖面积

题解:

利用扫描线的思想,先将坐标离散化,之后以y轴分成多个矩形求解,可以让下边界+1上边界-1

问题就转化为了:求区间中有多少个非0数,要求支持区间+1 -1操作

我们可以通过维护区间最小值以及最小值的个数来完成这件事情

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include <iostream>
#define maxn 5000
#define INF 59999999
#define eps 1e-6
#define mid (h+t)/2
using namespace std;
struct re
{
double a;int b;
}a[maxn],b[maxn];
struct ree
{
int h,t,x,lazy;
double sum,tot;
}p[maxn*];
double c[maxn];
int a1[maxn];
bool cmp(re x,re y)
{
if (x.a<y.a) return(true); else return(false);
}
void build(int x,int h,int t)
{
p[x].h=h; p[x].t=t; p[x].x=;
if (h==t)
{
p[x].sum=p[x].tot=c[h+]-c[h];
return;
}
build(x*,h,mid);
build(x*+,mid+,t);
p[x].sum=p[x].tot=p[x*].sum+p[x*+].sum;
}
void updata(int x)
{
p[x].x=min(p[x*].x,p[x*+].x);
if (p[x*].x==p[x*+].x)
{
p[x].sum=p[x*].sum+p[x*+].sum;
}
else
{
if (p[x*].x<p[x*+].x) p[x].sum=p[x*].sum;
else p[x].sum=p[x*+].sum;
}
return;
}
void down(int x)
{
if (p[x].lazy==) return;
p[x].x+=p[x].lazy;
p[x*].lazy+=p[x].lazy;
p[x*+].lazy+=p[x].lazy;
p[x].lazy=;
}
void insert(int x,int h,int t,int sum)
{
down(x);
if (p[x].h>t|| p[x].t<h) return;
if (h<=p[x].h &&p[x].t<=t)
{
p[x].lazy+=sum; down(x); return;
}
insert(x*,h,t,sum); insert(x*+,h,t,sum);
updata(x);
}
double query(int x,int h,int t)
{
down(x);
if (p[x].h>t||p[x].t<h) return();
if (h<=p[x].t && p[x].t<=t)
{
if (p[x].x==) return(p[x].tot-p[x].sum); else return(p[x].tot);
}
return(query(x*,h,t)+query(x*+,h,t));
}
int main()
{int n,o=;
while (cin>>n&&n!=)
{
o++;
memset(p,,sizeof(p));
for (int i=;i<=*n;i++) a[i].b=i,b[i].b=i;
for (int i=;i<=n;i++)
{
cin>>a[*i-].a>>b[*i-].a>>a[*i].a>>b[*i].a;
}
sort(a+,a++*n,cmp);
sort(b+,b++*n,cmp);
int ll=; a[].a=INF;
for (int i=;i<=*n;i++)
{
if (abs(a[i].a-a[i-].a)>eps) ll++;
a1[a[i].b]=ll;
c[ll]=a[i].a;
}
double ans=;
build(,,ll-);
for (int i=;i<*n;i++)
{
int pp,tmp=b[i].b;
if (tmp%==) pp= ;else pp=-;
insert(,a1[(tmp+)/*-],a1[(tmp+)/*]-,pp);
ans+=(b[i+].a-b[i].a)*query(,,ll-);
}
cout<<"Test case #"<<o<<endl<<"Total explored area: " ;
printf("%.2f\n\n",ans);
}
}

hdu 1542的更多相关文章

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

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

  2. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  3. hdu 1542 线段树扫描(面积)

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

  4. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  5. 扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]

    学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...

  6. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

  7. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  8. 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))

    扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...

  9. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

随机推荐

  1. GC.SuppressFinalize()的正确用法

    SuppressFinalize函数是: 该方法在对象头中设置一个位,系统在调用终结器时将检查这个位.obj 参数应为此方法的调用方. 实现 IDisposable 接口的对象可以从 IDisposa ...

  2. Http请求中 content-type 和 dataType 区别

    contentType: 告诉服务器,我要发什么类型的数据 dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回 XML,还是JSON,还是script,还是Stri ...

  3. TCP/IP详解 卷1 第十七章 TCP:传输控制协议

    17.2 TCP的服务 TCP提供了一种面向连接的.可靠的字节流服务.两个使用TCP的应用在彼此交换数据之前必须先建立一个TCP连接. TCP通过下列方式来提供可靠性: 1)  应用数据被分割成TCP ...

  4. C# 简单的反射机制实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  5. 第16月第27天 pip install virtualenv ipython sip brew search

    1. pip install virtualenv virtualenv testvir cd testvir cd Scripts activate pip https://zhuanlan.zhi ...

  6. POJ 1061 青蛙的约会 (扩展欧几里得算法)

    题目链接 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...

  7. 一:对程序员来说CPU是什么?

    0.开篇    (1)程序是什么?          指示计算机每一步动作的一组指令     (2)程序是由什么组成的?          指令和数据     (3)什么是机器语言?         ...

  8. 【ARTS】01_12_左耳听风-20190128~20190203

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. Python爬虫-爬取百度贴吧帖子

    这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...

  10. zabbix添加对自定义无规则的关键日志文件的监控

    zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...