HDU-1542-Atlantis

HDU-1542-Atlantis

http://acm.hdu.edu.cn/showproblem.php?pid=1542

用线段树求矩形面积的并,模仿别人的代码写的,还要好好研究啊哭

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
	int l;
	int r;
	int cover;
	double len;
};
node tree[2000];
struct Line
{
	double down;
	double up;
	double x;
	int cover;
};
Line line[250];
double yy[250];
int n,len;
int cmp(Line a,Line b)
{
	return a.x<b.x;
}
int find(double x)
{
	int low=0,high=len,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(yy[mid]==x)
		return mid;
		if(yy[mid]<x)
		low=mid+1;
		else
		high=mid-1;
	}
	return low;
}
void build(int k,int l,int r)
{
	tree[k].l=l;
	tree[k].r=r;
	tree[k].cover=0;
	tree[k].len=0;
	if(l+1==r)
	return;
	int mid=(l+r)/2;
	build(k<<1,l,mid);
	build(k<<1|1,mid,r);
}
void fun(int k)
{
	if(tree[k].cover)
    tree[k].len=yy[tree[k].r]-yy[tree[k].l];
	else if(tree[k].l+1==tree[k].r)
	tree[k].len=0;
	else 
    tree[k].len=tree[k<<1].len+tree[k<<1|1].len;
}
void update(int k,int l,int r,int cover)
{
	if(tree[k].l>r||tree[k].r<l)
	return;
	if(tree[k].l>=l&&tree[k].r<=r)
	{
		tree[k].cover+=cover;
		fun(k);
		return;
	}
	update(k<<1,l,r,cover);
	update(k<<1|1,l,r,cover);
	fun(k);
}
int main()
{
	double x1,y1,x2,y2,ans;
	int i,m,cas=1;
	int a,b;
	while(scanf("%d",&n)!=EOF,n)
	{
		m=0;
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
			yy[m]=y1;
			line[m].cover=1;
			line[m].x=x1;
			line[m].down=y1;
			line[m].up=y2;
			m++;
			yy[m]=y2;
			line[m].cover=-1;
			line[m].x=x2;
			line[m].down=y1;
			line[m].up=y2;
			m++;
		}
		sort(yy,yy+m);
		len=unique(yy,yy+m)-yy;
		len--;
		build(1,0,len);
		sort(line,line+m,cmp);
		ans=0;
		printf("Test case #%d\n",cas++);
		for(i=0;i<m-1;i++)
		{
			a=find(line[i].down);
			b=find(line[i].up);
			update(1,a,b,line[i].cover);
		    ans+=tree[1].len*(line[i+1].x-line[i].x);
		}
		printf("Total explored area: %0.2lf\n\n",ans);
	}
	return 0;
}


你可能感兴趣的:(struct,tree,ini,Build,fun)