点此看题面

大致题意: 给你\(N\)个矩形,请你求出它们覆盖的面积(重叠的面积只算一次)。

扫描线

这道题是一道典型的求矩形面积并问题,是扫描线的一个经典运用。这里就不赘述了。

代码

#include<bits/stdc++.h>
#define N 100
using namespace std;
int n,cnt,Exist[N<<4];
double Sum[N<<4],xy[(N<<2)+5];
struct Square
{
int flag,nx,ny1,ny2;
double x,y1,y2;
}a[2*N+5];
map<double,int> p,p_;
map<int,double> f,f_;
//线段树模板--------------------------------------------------------------------
inline void PushUp(int l,int r,int rt)
{
if(Exist[rt]) Sum[rt]=f[r+1]-f[l];
else if(l==r) Sum[rt]=0;
else Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];
}
inline void Update(int l,int r,int rt,int L,int R,int v)//线段树的区间修改
{
if(L>R) return;
if(L<=l&&r<=R) {Exist[rt]+=v,PushUp(l,r,rt);return;}
int mid=l+r>>1;
if(L<=mid) Update(l,mid,rt<<1,L,R,v);
if(R>mid) Update(mid+1,r,rt<<1|1,L,R,v);
PushUp(l,r,rt);
}
//----------------------------------------------------------------------------
inline bool cmp(Square x,Square y)
{
return x.nx<y.nx;
}
int main()
{
register int i;int k=0;double x1,x2,y1,y2;
while(~scanf("%d",&n),n)
{
for(cnt=0,p=p_,f=f_,i=1;i<=n;++i)
cin>>x1>>y1>>x2>>y2,a[(i<<1)-1]=(Square){1,0,0,0,xy[(i<<2)-3]=x1,xy[(i<<2)-2]=y1,xy[(i<<2)-1]=y2},a[i<<1]=(Square){-1,0,0,0,xy[i<<2]=x2,y1,y2};
//一个离散化的过程--------------------------------------------------------------------
sort(xy+1,xy+(n<<2)+1);
for(i=1;i<=n<<2;++i)
if(!p[xy[i]]) f[p[xy[i]]=++cnt]=xy[i];
for(i=1;i<=n<<1;++i)
a[i].nx=p[a[i].x],a[i].ny1=p[a[i].y1],a[i].ny2=p[a[i].y2];
//--------------------------------------------------------------------------------
sort(a+1,a+(n<<1)+1,cmp),memset(Exist,0,sizeof(Exist)),memset(Sum,0,sizeof(Sum));
int Now=1;double ans=0.0;//Now表示当前扫描到的边的编号,ans记录面积
for(i=1;i<=cnt;++i)
{
ans+=(f[i]-f[i-1])*Sum[1];//更新ans
if(a[Now].nx^i) continue;//如果当前边不在扫描到的这一列上,就跳过
while(a[Now].nx==i&&Now<=n<<1)
Update(1,cnt,1,a[Now].ny1,a[Now].ny2-1,a[Now].flag),++Now;//修改,操作下一条边
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++k,ans);
}
return 0;
}

注:线段树用的数组要开大,因为离散化后的边的大小是\(4n\)的(当然,有些打法是\(2n\)的),所以线段树的数组要开\(16n\)。

【HDU1542】Atlantis (扫描线的经典运用)的更多相关文章

  1. [HDU1542]Atlantis(扫描线+线段树)

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

  2. hdu1542 Atlantis(矩阵面积的并)

    这个题算是我的第一个扫描线的题,扫描线算是一种思想吧,用到线段树+离散化.感觉高大上. 主要参考了这位大神的博客. http://www.cnblogs.com/kuangbin/archive/20 ...

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

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

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

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

  5. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

  6. [POJ1151][HDU1542]Atlantis(线段树,扫描线)

    英文题面,我就只放个传送门了. Solution  题意是算矩形面积并,这是扫描线算法能解决的经典问题. 算法的大致思想是,把每一个矩形拆成上边和下边(以下称作扫描线),每条扫描线有四个参数l,r,h ...

  7. HDU-1542 Atlantis(离散化+扫描线)

    题目大意:给n个矩形,可能重叠,求面积. 题目分析:线段树维护扫描线. 代码如下: # include<bits/stdc++.h> using namespace std; # defi ...

  8. Poj1151&HDU1542 Atlantis(扫描线+线段树)

    题意 给定\(n​\)个矩形\((x_1,y_1,x_2,y_2)​\),求这\(n​\)个矩形的面积并 题解 扫描线裸题,可以不用线段树维护,\(O(n^2)\)是允许的. #include < ...

  9. hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

    题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...

随机推荐

  1. 排序工作量之新任务(SHOI2001)

    排序工作量之新任务(SHOI2001) 给出两个整数n和t,求n的全排列中逆序对数为t的个数,和逆序对数为t的字典序最小全排列. 首先第一个问题可以用dp解决,\(f[i][j]\)表示前i个数,j个 ...

  2. RRTI的概念以及Class对象作用

    深入理解Class对象 RRTI的概念以及Class对象作用 认识Class对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一 ...

  3. 40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现

    简述:QPropertyAnimation (动画类,用来向QObject对象添加动画) 该类的继承框图如下所示: 1.QAbstractAnimation(所有动画的抽象基类) 该抽象类为QProp ...

  4. Jmeter_前端RSA加密下的登陆模拟_引用js文件实现(转)

    在一次项目实战中,前端登录使用了RSA加密,使用LoadRunner压测的第一步,就是模拟用户登录,可惜loadRunner11并不能录制前端的加密过程,并且安装的LR是基于C语言版,网络上关于RSA ...

  5. c# 手动实现 \u 转义字符。。效果。。。

    string s ="\\u"+item.Icon; // item.Icon = UnicodeEncoding.Unicode.GetString(UnicodeEncodin ...

  6. LCS(Longest Common Subsequence)

    http://blog.csdn.net/zztfj/article/details/6157429 LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题 ...

  7. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  8. Spark Mllib里的如何对单个数据集用斯皮尔曼计算相关系数

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...

  9. C 碎片八 结构体&枚举&联合

    一.结构体 1, 结构体定义 结构体类型的定义:任意数据类型变量的集合.用于描述一个具体的事物的信息,在C语言中描述一件事物一般都是用结构体 声明结构体类型的格式: struct  结构体名 {成员列 ...

  10. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...