线段树扫描线 HDU 1542
n个矩形 问他们覆盖的面积重复的就算一次
x数组存线段 然后根据横坐标排一下
z 线段树 l - r 就是1 ~ 2*n
#include<stdio.h>
#include<algorithm>
#include<string.h> using namespace std; #define MAXN 110
struct line
{
double x,y1,y2;
int flag;
}x[MAXN];
double y[MAXN<<]; struct node
{
int l,r,cov;
double x,y_up,y_down; }z[*MAXN]; bool cmp(line a,line b)
{
return a.x<b.x;
}
void Build(int l,int r,int a)
{
z[a].l=l;
z[a].r=r;
z[a].cov=;
z[a].x=-;
z[a].y_down=y[l];
z[a].y_up=y[r]; if(l+==r)//叶子节点
return ;
int mid=(l+r)>>;
Build(l,mid,a<<);
Build(mid,r,a<<|);//这边是mid
}
double Insert(int l,int r,int ind,int a)
{
if(x[ind].y1>=z[a].y_up||x[ind].y2<=z[a].y_down) //在外面
return ; if(l+==r)//叶子节点
{
if(z[a].cov>)
{
double sum=(x[ind].x-z[a].x)*(z[a].y_up-z[a].y_down);
z[a].x=x[ind].x; //这边要更新x
z[a].cov+=x[ind].flag;
return sum;
}
else
{
z[a].x=x[ind].x;
z[a].cov+=x[ind].flag;
return ;
}
}
double ans1,ans2;
int mid=(l+r)>>;
ans1=Insert(l,mid,ind,a<<);
ans2=Insert(mid,r,ind,a<<|);//这边是mid
return ans1+ans2; }
int main()
{
int n,ca=; while(scanf("%d",&n)!=EOF&&n)
{
int cnt=; for(int i=;i<=n;i++)
{
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
x[cnt].x=x1;
x[cnt].y1=y1;
x[cnt].y2=y2;
x[cnt].flag=;
y[cnt]=y1;
cnt++; x[cnt].x=x2;
x[cnt].y1=y1;
x[cnt].y2=y2;
x[cnt].flag=-;
y[cnt]=y2;
cnt++;
}
sort(y+,y+cnt);
sort(x+,x+cnt,cmp);
Build(,cnt-,);
double ans=;
for(int i=;i<cnt;i++)
{
ans+=Insert(,cnt-,i,);
}
printf("Test case #%d\n",ca++);
printf("Total explored area: %.2lf\n\n",ans);
}
return ;
}
线段树扫描线 HDU 1542的更多相关文章
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))
扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
随机推荐
- html+javascript实现可拖动可提交的弹出层对话框效果
本文为大家介绍下使用html+javascript实现可拖动弹出层.对话框.可提交,具体代码如下,感兴趣的朋友可以参考下,希望对大家有所帮助 <!DOCTYPE HTML PUBLIC &quo ...
- JS总结之二:DOM对象控制HTML
DOM对象控制HTML 1.方法 getElementsByName( ) ——获取name getElementsByTagName( ) ——获取元素 getAttribute( ) ——获取元素 ...
- hdu_5734_Acperience
题目连接:hdu_5734_Acperience 多校的题我还是贴官方题解的好,方便快捷,省事!! #include<cstdio> #include<cmath> #defi ...
- 在Linux中设置共享目录
1. 是否安装了samba服务 sudo apt-get install samba sudo apt-get install smbfs 2. 创建需要共享的目录/ home/usr/share ...
- [科普]DNS相关的攻击介绍
一 什么是DNS DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不 ...
- string 转 int,int 转 string
string str="12345"; int b=atoi(str.c_str()); 可以配合atof,转为double char buf[10]; sprintf(buf, ...
- 导航条css实现和table实现
导航条式样 <style type="text/css"> ul,li{ margin:0; padding:0; list-style:none; } #navtop ...
- php获取当前文件绝对路径
php如何获取当前文件的绝对路径. dirname(__FILE__) 函数返回的是脚本所在在的路径 <?php $basedir = dirname(__FILE__); echo $base ...
- mongodb replica set介绍
近年来,随着大数据越来越火,非关系型数据库的重要性被越来越多的人所认知,越来越多的开发者逐渐加入到NoSQL的阵营中.我们知道NoSQL是Not Only SQL的意思,既然如此,很多关系型数据库所支 ...
- java regex possissive relunctant
Java正则表达中Greedy Reluctant Possessive 的区别 分类: java 2015-01-16 00:28 1588人阅读 评论(9) 收藏 举报 正则表达式Java 目录( ...