void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一样的题,简单面积并,直接套模版就行

#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#define MID(x,y) ((x+y)>>1)
#define L(x) (x<<1)
#define R(x) (x<<1|1)
using namespace std;
const int MAX = 10100;
struct Rec{int x,y1,y2;int flag;};
struct Tnode{int l,r,cover; int length;};
Tnode node[MAX*4];
Rec rr[MAX];
int y[MAX],k;
void add_line(int x1,int y1,int x2,int y2)
{
        rr[k].x = x1; rr[k].y1 = y1;
        rr[k].y2 = y2; rr[k].flag = 1;
        y[k++] = y1;
        rr[k].x = x2; rr[k].y1 = y1;
        rr[k].y2 = y2; rr[k].flag = -1;
        y[k++] = y2;
}
void init()
{
	memset(node,0,sizeof(node));
}
bool cmp(Rec a,Rec b)
{
	return a.x < b.x;
}
void build(int t,int l,int r)
{
	node[t].l = l;
	node[t].r = r;
	if( l == r - 1 ) return ;
	int mid = MID(l,r);
	build(R(t),mid,r);
	build(L(t),l,mid);
}
void len(int t)
{
	if( node[t].cover > 0 )
		node[t].length = y[node[t].r] - y[node[t].l];
	else
		if( node[t].l == node[t].r - 1 )
			node[t].length = 0.0;
		else
			node[t].length = node[R(t)].length + node[L(t)].length;
}
void update(int t,Rec p)
{
	if( y[node[t].l] == p.y1 && y[node[t].r] == p.y2 )
	{
		node[t].cover += p.flag;
		len(t);
		return ;
	}
	int mid = MID(node[t].l,node[t].r);
	if( p.y1>=y[mid])
		update(R(t),p);
	else
		if( p.y2<=y[mid] )
			update(L(t),p);
		else
		{
			Rec tmp = p;
			tmp.y2 = y[mid];
			update(L(t),tmp);
			tmp = p;
			tmp.y1 = y[mid];
			update(R(t),tmp);
		}
	len(t);
}

long long solve(int n,int cnt)
{
	init();
	build(1,0,cnt-1);
	long long sum = 0;
	update(1,rr[0]);
	for(int i=1; i<n; i++)
	{
		sum += (rr[i].x - rr[i-1].x)*node[1].length;
		update(1,rr[i]);
	}
	return sum;
}
int main()
{
	int n;
	int ind = 1;
	int x1,x2,y1,y2;
	while( ~scanf("%d%d%d%d",&x1,&y1,&x2,&y2) )
	{
		if(x1==-1)break;
		k=0;
		add_line(x1,y1,x2,y2);
		while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)&&x1!=-1)
		{
			add_line(x1,y1,x2,y2);
		}
		sort(rr,rr+k,cmp);
		sort(y,y+k);
		int t = k;
		k = unique(y,y+k) - y;
		long long  area = solve(t,k);
		printf("%lld\n",area);
	}
return 0;
}
posted on 2011-08-07 00:12  void-man  阅读(239)  评论(0)    收藏  举报