您的位置:首页 > 其它

矩形面积并模板,今年不会了,哭死

2011-10-04 15:19 155 查看
#include<iostream>//poj 1151
#include<cstdio>
#include<cmath>
#include<string.h>
#include<algorithm>
using namespace std;
//#define see(x) cout<<#x<<":"<<x<<endl;
#define e 3000
struct no{
double x,stay,endy;
int sta,end;
int out;
int cover;
bool operator <(const no &a)const{
return x < a.x;
}
}num[e];
double yy[e];
struct node{
int l,r;
double sum;
double len;
int cover;
int state;
}tree[e*4];
/************矩形面积并模板**************************/
void build(int nod,int l,int r)
{
tree[nod].l=l;
tree[nod].r=r;
tree[nod].len=yy[r]-yy[l];
tree[nod].sum=0;
tree[nod].cover=0;
if(r-l<=1) return ;
int mid = (l+r)>>1;
build(nod<<1,l,mid);
build(nod<<1|1,mid,r);
}
void insert(int nod,int l,int r,int state)
{
if(l<= tree[nod].l && tree[nod].r<=r)
{

tree[nod].cover+=state;
}
else
{
int mid=(tree[nod].r+ tree[nod].l)>>1;
if(l< mid)
insert(nod<<1,l,r,state);
if(mid<r)
insert(nod<<1|1,l,r,state);
}
if(tree[nod].cover>0)
{
tree[nod].sum=tree[nod].len;
}
else
{
if(tree[nod].r-tree[nod].l>1)
tree[nod].sum= tree[nod<<1].sum+tree[nod<<1|1].sum;
else
tree[nod].sum=0;
}
}
/************矩形面积并模板**************************/
int main()
{
#ifndef ONLINE_JUDGE
freopen("//home//mabodx//桌面//in.txt","r",stdin);
#endif
int n,m,i,j,k,t;
k=0;
while(scanf("%d", &n))
{
k++;
memset(yy,0,sizeof(yy));
memset(num,0,sizeof(num));
memset(tree,0,sizeof(tree));
if(n==0) break;
if(k!=1)
printf("\n");
double x1,x2,y1,y2;
int cnt=0;
for(i=0; i<n ;i++)
{
scanf("%lf%lf%lf%lf", &x1,&y1,&x2,&y2);
yy[++cnt]=y1;
yy[++cnt]=y2;

num[i*2].x=x1;
num[i*2].stay=y1;
num[i*2].endy=y2;
num[i*2].out=0;

num[i*2+1].x=x2;
num[i*2+1].stay=y1;
num[i*2+1].endy=y2;
num[i*2+1].out=1;
}

sort(yy+1,yy+cnt+1);
sort(num,num+(2*n));

int cn=0;
for(i=2; i<=cnt;i++)
{
if(yy[i]!= yy[i-1])
yy[++cn]=yy[i-1];
}
yy[++cn]=yy[cnt];

for(i=0; i<=2*n-1; i++)
{
num[i].sta=lower_bound(yy+1,yy+cn+1,num[i].stay)-yy;
num[i].end=lower_bound(yy+1,yy+cn+1,num[i].endy)-yy;
}
build(1,1,cn);
double area=0;
/************矩形面积并模板**************************/
for(i=0; i<2*n-1; i++)
{
if(num[i].out==0)
insert(1,num[i].sta,num[i].end,1);
else
insert(1,num[i].sta,num[i].end,-1);
area+=(tree[1].sum* (num[i+1].x- num[i].x) );
}
/************矩形面积并模板**************************/
printf("Test case #%d\n",k);
printf("Total explored area: %.2lf\n",area);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: