HDU-1542 Atlantis(离散化+扫描线)
题目大意:给n个矩形,可能重叠,求面积。
题目分析:线段树维护扫描线。
代码如下:
# include<bits/stdc++.h>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=100000; struct Segment
{
double x1,x2,y;
bool buttom;
};
Segment seg[(N<<1)+5];
struct Node
{
double m; ///被覆盖的长度
int c; ///被完全覆盖的次数
};
Node tr[N*4+5];
double x[N*2+5];
map<double,int>mp; bool comp(const Segment &s1,const Segment &s2)
{
return s1.y<s2.y;
} void build(int rt,int l,int r)
{
tr[rt].m=0.0;
tr[rt].c=0;
if(l==r) return ;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} void updateHere(int rt,int l,int r)
{
if(tr[rt].c>0)
tr[rt].m=x[r]-x[l-1];
else if(l==r)
tr[rt].m=0;
else tr[rt].m=tr[rt<<1].m+tr[rt<<1|1].m;
} void update(int rt,int l,int r,int L,int R,int val)
{
if(L<=l&&r<=R){
tr[rt].c+=val;
updateHere(rt,l,r);
}else{
if(L<=mid) update(rt<<1,l,mid,L,R,val);
if(R>mid) update(rt<<1|1,mid+1,r,L,R,val);
updateHere(rt,l,r);
}
} int main()
{
int n;
int cas=0;
while(~scanf("%d",&n)&&n)
{
double x1,y1,x2,y2;
for(int i=0;i<n;++i){
cin>>x1>>y1>>x2>>y2;
seg[i<<1].x1=x1,seg[i<<1].x2=x2;
seg[i<<1].y=y1;
seg[i<<1].buttom=true;
seg[i<<1|1].x1=x1,seg[i<<1|1].x2=x2;
seg[i<<1|1].y=y2;
seg[i<<1|1].buttom=false;
x[i<<1]=x1;
x[i<<1|1]=x2;
}
n<<=1;
sort(seg,seg+n,comp);
sort(x,x+n);
int len=unique(x,x+n)-x;
for(int i=0;i<len;++i)
mp[x[i]]=i;
build(1,1,len-1);
seg[2*n].y=seg[2*n-1].y;
double ans=0;
for(int i=0;i<n;++i){
int l=mp[seg[i].x1];
int r=mp[seg[i].x2];
if(seg[i].buttom)
update(1,1,len-1,l+1,r,1);
else update(1,1,len-1,l+1,r,-1);
ans+=tr[1].m*(seg[i+1].y-seg[i].y);
}
printf("Test case #%d\n",++cas);
printf("Total explored area: %.2lf\n\n",ans);
}
return 0;
}
HDU-1542 Atlantis(离散化+扫描线)的更多相关文章
- (中等) HDU 1542 Atlantis,扫描线。
Problem Description There are several ancient Greek texts that contain descriptions of the fabled is ...
- HDU 1542 Atlantis(扫描线)题解
题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
- HDU 1542 Atlantis(矩形面积并)
HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ 1151 HDU 1542 Atlantis(扫描线)
题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...
- HDU 1542 线段树+扫描线+离散化
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 宜家的幸福生活,源于K2 BPM的支撑
很久很久以前,有一篇很火的文章在各大网站被疯狂转载<一个在北欧生活10年的MM,告诉你为什么北欧全球幸福指数第一>,开头第一段就已经让人羡慕嫉妒恨了. "下午的四.五点钟,北欧人 ...
- MSP430G2553之timerA产生PWM
总结:选SMCLK(可以测出来) 若选ACLK,经示波器PWM时有时无 举例一: #include <MSP430G2553.h> #define CPU_F ((doub ...
- App Store--心酸的上线路,说说那些不可思议的被拒理由
yoyeayoyea 您的应用包括色情内容(色情交易,色情展示). 原因是我们的销售人员,把几张艺术照放在个人相册里(头像),换成卡通头像,通过. 颜小风 被拒很正常 一次通过不正常. 之前上线 ...
- arguments.callee
arguments.callee在哪个函数中运行,他就代表哪个函数,一般在匿名函数中.在匿名函数中有时需要自己调用自己,但是由于是匿名函数,没有名字,所以可以用arguments.callee来代替匿 ...
- poj2649 数论
//Accepted 420K 16MS //考虑 0和n! does not divide // 1和0! divides #include <cstdio> #include < ...
- ACM2013.9.7
acm还是要好好做的,还有好多的东西要学呢!不能不认真对待了,该玩够了!
- UNICODE字符集(20140520)
1多字节字符集,如"IT学吧",sizeof内存长度为7,因为前面2个字母各占用一个字节,后面两个汉字各占用2个字节,结尾的\0占用一个字节.strlen即字符串长度的结果为6. ...
- 保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()
当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候. 注意上面 ...
- A sample of procedure in using
- iOS开发之瞬间位移动画效果
步骤:1.使用single view application 创建一个新的项目 2.在.h文件中遵守<UIGestureRecognizerDelegate>协议,创建一个UIimagev ...