线段树扫描线 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 ...
随机推荐
- 线程中sleep方法和wait方法有什么区别?
如果你没有接触过java的多线程,那么多对于这两个方法可能有点陌生,看名字好像这两个方法是差不多的,但是实际上面差别好大. 首先我们看一下官方的API Sleep(sleep有两个方法,另一个方法传递 ...
- Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/html"
2015-11-16 10:39:17.235 PullDemo[338:60b] Application windows are expected to have a root view contr ...
- PHP xdebug的安装
xdebug实际上就是PHP的一个第三方扩展 安装xdebug步骤和添加一个PHP扩展一样 linux:去xdebug官网下载对应版本的源码,然后像编译其他linux扩展一样,详解我的一篇关于Linu ...
- Fatal error: Class ‘mysqli’ not found in解决办法
在使用[$conn = new \mysqli($servername, $username, $password,$dbname);]连接msql数据库的时候 出现错误:[Fatal error: ...
- Socks
Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...
- Css 之 px em %
在页面整体布局中,页面元素的尺寸大小(长度.宽度.内外边距等)和页面字体的大小也是重要的工作之一.一个合理设置,则会让页面看起来层次分明,重点鲜明,赏心悦目.反之,一个不友好的页面尺寸和字体大小设置, ...
- OpenGL网络资源
转 十大OpenGL教程 1.http://nehe.gamedev.net/这个是我觉得全世界最知名的OpenGL教程,而且有网友将其中48个教程翻译成了中文http://www.owlei.com ...
- 第四届河南省省赛 走迷宫 二分+DFS
题目思路:使用二分查找路径中最大值和最小值之间的差值,从而确定出一组minn和maxn,对此组的minn和maxn经行DFS,如果可以找到一条路径,其中的最大值,最小值在minn~maxn的范围内,则 ...
- ios字体大小适应不同屏幕
//根据button高度来设置字体大小 CGFloat dayLabelWidth = (viewWidth-10)/7-1; cancelButton = [[UIButton alloc] ini ...
- 怎样将MySQL数据库上传到服务器
首先,需要将本地的数据库导出来,作为一个数据文件,以备稍后上传到服务器用,在本地登陆phpmyadmin控制面板: 登陆成功后,在左侧选择需要操作的数据库: 选择后,页面会自动刷新,然后再在右边点击[ ...