1542

1255

两道扫描线+线段树的入门题。
基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq。

hdu1542 代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200010
using namespace std;
int n,c,cnt;
double y[MAXN];
struct Node{double x,l,r;int cover;bool flag;
}node[MAXN];
struct Line
{double x,y_up,y_down;int flag;
}line[MAXN];
inline bool cmp(struct Line x,struct Line y){return x.x<y.x;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void build(int x,int l,int r)
{node[x].l=y[l],node[x].r=y[r],node[x].x=-1,node[x].flag=false,node[x].cover=0;if(l+1==r){node[x].flag=true; return;}int mid=(l+r)>>1;build(ls(x),l,mid);build(rs(x),mid,r);
}
inline double q_update(int x,double pos,double l,double r,int flag)
{if(l>=node[x].r||r<=node[x].l) return 0;if(node[x].flag){if(node[x].cover<=0) {node[x].x=pos;node[x].cover+=flag;return 0;}double pre=node[x].x;double ans=(pos-pre)*(node[x].r-node[x].l);node[x].x=pos;node[x].cover+=flag;return ans;}return q_update(ls(x),pos,l,r,flag)+q_update(rs(x),pos,l,r,flag);
}
int main()
{scanf("%d",&n);while(n!=0){double x1,x2,y1,y2;cnt=0;for(int i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);line[++cnt].x=x1,line[cnt].y_down=y1,line[cnt].y_up=y2,line[cnt].flag=1,y[cnt]=y1;line[++cnt].x=x2,line[cnt].y_down=y1,line[cnt].y_up=y2,line[cnt].flag=-1,y[cnt]=y2;}sort(&line[1],&line[cnt+1],cmp);sort(&y[1],&y[cnt+1]);build(1,1,cnt);double ans=0;for(int i=1;i<=cnt;i++)ans+=q_update(1,line[i].x,line[i].y_down,line[i].y_up,line[i].flag);printf("Test case #%d\nTotal explored area: %.2lf\n\n",++c,ans);scanf("%d",&n);}return 0;
}

hdu1255 代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200010
using namespace std;
int n,c,cnt,t;
double y[MAXN];
struct Node{double x,l,r;int cover;bool flag;
}node[MAXN];
struct Line
{double x,y_up,y_down;int flag;
}line[MAXN];
inline bool cmp(struct Line x,struct Line y){return x.x<y.x;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void build(int x,int l,int r)
{node[x].l=y[l],node[x].r=y[r],node[x].x=-1,node[x].flag=false,node[x].cover=0;if(l+1==r){node[x].flag=true; return;}int mid=(l+r)>>1;build(ls(x),l,mid);build(rs(x),mid,r);
}
inline double q_update(int x,double pos,double l,double r,int flag)
{if(l>=node[x].r||r<=node[x].l) return 0;if(node[x].flag){if(node[x].cover<=1) {node[x].x=pos;node[x].cover+=flag;return 0;}double pre=node[x].x;double ans=(pos-pre)*(node[x].r-node[x].l);node[x].x=pos;node[x].cover+=flag;return ans;}return q_update(ls(x),pos,l,r,flag)+q_update(rs(x),pos,l,r,flag);
}
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);double x1,x2,y1,y2;cnt=0;for(int i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);line[++cnt].x=x1,line[cnt].y_down=y1,line[cnt].y_up=y2,line[cnt].flag=1,y[cnt]=y1;line[++cnt].x=x2,line[cnt].y_down=y1,line[cnt].y_up=y2,line[cnt].flag=-1,y[cnt]=y2;}sort(&line[1],&line[cnt+1],cmp);sort(&y[1],&y[cnt+1]);build(1,1,cnt);double ans=0;for(int i=1;i<=cnt;i++)ans+=q_update(1,line[i].x,line[i].y_down,line[i].y_up,line[i].flag);printf("%.2lf\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10263273.html

hdu 1542/1255 Atlantis/覆盖的面积相关推荐

  1. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

    [题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...

  2. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  3. 【HDU - 1542】Atlantis (线段树,扫描线)

    题干: There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...

  4. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  5. HDU 1255 覆盖的面积(线段树+扫描线)

    题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...

  6. hdu 1255 覆盖的面积 (扫描线求矩形交)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. hdu 1255 覆盖的面积

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. 扫描线三巨头 hdu1928hdu 1255 hdu 1542 [POJ 1151]

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

  9. HDU1255 覆盖的面积 (线段树 + 扫描线)

    题目链接:覆盖的面积 大致题意 现在有平面直角坐标系xoy, 有n个平行于x轴y轴的矩形, 给出这些矩形的左上角和右下角的坐标, 让你求出这些矩形组成的图形中被至少两个矩形覆盖的部分的总面积. 解题思 ...

最新文章

  1. php算法学习,php算法学习之动态规划
  2. JDK 10:从Java访问Java应用程序的进程ID
  3. SpringBoot2 Redis连接池
  4. oracle练习(mldn视频)二
  5. 三级等级保护之安全管理中心
  6. 因特尔显卡自定义分辨率_Win10创建自定义分辨率的方法教程
  7. Mac CAD 安装完成后,打开注册机时出现 应用程序“02_注册机”不能打开。
  8. 【idea基础知识】idea在merge时颜色不同的各个区块代表的意思
  9. 韩国历史最悠久的银行推出全国区块链贷款平台
  10. MT【299】对数型数列不等式
  11. 【语音从零之五】用科大讯飞语音包实现语音打开已安装应用程序
  12. 2023首届大学生算法大赛——补题
  13. 如何将喜马拉雅FM的音频下载下来保存
  14. u盘格式化后如何恢复数据,三步轻松恢复!
  15. matlab中有解耦指令吗,powertrain-mounting_Opti 发动机悬置系统解耦率、固有频率以及参数优化程序 matlab 266万源代码下载- www.pudn.com...
  16. 黑客独角兽_写作是产品设计师真正的独角兽技能
  17. 中职计算机基础微课,中职计算机教育微课应用
  18. 程序写到无力吐槽 来点冷笑话
  19. SQL Server 省市县数据库下载【百度云】
  20. 职高计算机教师招聘考试内容,中高职类教师招聘备考建议

热门文章

  1. centos7服务器文件同步,centos7文件实时同步工具lsyncd
  2. java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析
  3. 经常使用计算机的孩子,常玩电脑对孩子负面影响大,家长们不容小觑!
  4. uni-app内置地图轨迹_MIUI11 新增亲情守护,支持安全围栏、运动轨迹功能
  5. python中的运算符_Python 中的神秘运算符
  6. 160 - 41 defiler.1.exe
  7. 《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》
  8. 【视觉项目】【day5】8.25号实验记录(修完BUG,28张测试图,13个样本,四张测试图误判,这比之前效果好很多了)
  9. scala hashmap_如何在Scala中将Hashmap转换为Map?
  10. c# 声明类的时候初始化类_使用C#初始化的列表声明