poj 1177

线段树,详见陈宏的论文。简单讲就是每两次覆盖之间的差值的总和。

代码:

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

struct e{
	int l,r,conut,size;
}tree[5000*8];

int a[20001];
int b[20001];
int a1[10001];
int b1[10001];
int n;
struct xxx{
	int s,t,f,x;
}xx[10001];

struct yyy{
	int s,t,f,y;
}yy[10001];

void build(int l,int r,int p){
	tree[p].l=l;
	tree[p].r=r;
	tree[p].size=0;
	tree[p].conut=0;
	if(l<r-1)
	{
		int mid=(l+r)>>1;
		build(l,mid,2*p);
		build(mid,r,2*p+1);
	}
}

int cmp(const void *a,const void *b){
	return ((xxx *)a)->x-((xxx *)b)->x;
}

int cmp1(const void *a,const void *b){
	return ((yyy *)a)->y-((yyy *)b)->y;
}

void insert(int l,int r,int p,int f){
	if(tree[p].l==l&&tree[p].r==r)
	{
		tree[p].conut++;
		if(tree[p].conut==1)
		{
			if(f==0)
				tree[p].size=a1[r]-a1[l];
			else
				tree[p].size=b1[r]-b1[l];
		}
	}
	else
	{
		int mid=(tree[p].l+tree[p].r)>>1;
		if(r<=mid)
			insert(l,r,2*p,f);
		else
			if(l>=mid)
				insert(l,r,2*p+1,f);
			else
			{
				insert(l,mid,2*p,f);
				insert(mid,r,2*p+1,f);
			}
			if(tree[p].conut==0)
			{
				tree[p].size=tree[2*p].size+tree[2*p+1].size;
			}
	}
}

void delet(int l,int r,int p){
	if(tree[p].l==l&&tree[p].r==r)
	{
		tree[p].conut--;
		if(tree[p].conut==0)
			tree[p].size=tree[2*p].size+tree[2*p+1].size;
	}
	else
	{
		int mid=(tree[p].l+tree[p].r)>>1;
		if(r<=mid)
			delet(l,r,2*p);
		else
			if(l>=mid)
				delet(l,r,2*p+1);
			else
			{
				delet(l,mid,2*p);
				delet(mid,r,2*p+1);
			}
			if(tree[p].conut==0)
			{
				tree[p].size=tree[2*p].size+tree[2*p+1].size;
			}
	}
}
int cmp2(const void *a,const void *b){
	return *((int *)a)-*((int*)b);
}


void read(){
//	ifstream cin("in.txt");
	int i,j,k,k1;
	int m1,m2,m3,m4;
//	cin>>n;
	scanf("%d",&n);
	k=0;k1=0;
	for(i=1;i<=n;i++)
	{
//		cin>>m1>>m2>>m3>>m4;
		scanf("%d%d%d%d",&m1,&m2,&m3,&m4);
		if(!b[m1+10000])
		{
			b[m1+10000]=1;
			b1[++k1]=m1;
		}
		if(!a[m2+10000])
		{
			a[m2+10000]=1;
			a1[++k]=m2;
		}
		if(!b[m3+10000])
		{
			b[m3+10000]=1;
			b1[++k1]=m3;
		}
		if(!a[m4+10000])
		{
			a[m4+10000]=1;
			a1[++k]=m4;
		}
		xx[2*i-1].s=m2;
		xx[2*i-1].t=m4;
		xx[2*i-1].f=0;
		xx[2*i-1].x=m1;

		xx[2*i].s=m2;
		xx[2*i].t=m4;
		xx[2*i].f=1;
		xx[2*i].x=m3;

		yy[2*i-1].s=m1;
		yy[2*i-1].t=m3;
		yy[2*i-1].f=0;
		yy[2*i-1].y=m2;

		yy[2*i].s=m1;
		yy[2*i].t=m3;
		yy[2*i].f=1;
		yy[2*i].y=m4;
	}
	qsort(a1+1,k,sizeof(int),cmp2);
	qsort(b1+1,k1,sizeof(int),cmp2);
	for(i=1;i<=k;i++)
		a[a1[i]+10000]=i;
	for(i=1;i<=k1;i++)
		b[b1[i]+10000]=i;
	build(1,k,1);
	qsort(xx+1,2*n,sizeof(xxx),cmp);
	qsort(yy+1,2*n,sizeof(yyy),cmp1);
	j=0;
	int ans=0;
	for(i=1;i<=2*n;i++)
	{
		if(xx[i].f==0)
			insert(a[xx[i].s+10000],a[xx[i].t+10000],1,0);
		else
			delet(a[xx[i].s+10000],a[xx[i].t+10000],1);
		ans+=abs(tree[1].size-j);
		j=tree[1].size;
	}
	build(1,k1,1);
	j=0;
	for(i=1;i<=2*n;i++)
	{
		if(yy[i].f==0)
			insert(b[yy[i].s+10000],b[yy[i].t+10000],1,1);
		else
			delet(b[yy[i].s+10000],b[yy[i].t+10000],1);
		ans+=abs(tree[1].size-j);
		j=tree[1].size;
	}
	cout<<ans<<endl;
}

int main(){
	read();
	return 0;
}

posted on 2011-03-08 10:45  宇宙吾心  阅读(914)  评论(0)    收藏  举报

导航