记一个板子得了:我真的是学不动了
求面积:
#include<bits/stdc++.h>
using namespace std;
const int N=111;
struct Edge
{
double l,r;//这条线的左右端点的横坐标
double h;//这条线的纵坐标
int f;//这条线是矩形的上边还是下边
} e[N<<1];
bool cmp(Edge a,Edge b)
{
return a.h<b.h;
}
struct node
{
int l,r;//横坐标的区间,是横坐标数组的下标
int s;//该节点被覆盖的情况(是否完全覆盖)
double len;//该区间被覆盖的总长度
} q[N*8];
double x[2*N];//横坐标
#define ls i<<1
#define rs i<<1|1
#define m(i) ((q[i].l+q[i].r)>>1)
void build(int i,int l,int r)
{
q[i].l=l;
q[i].r=r;
q[i].s=0;
q[i].len=0;
if(l==r)
return;
int mid=m(i);
build(ls,l,mid);
build(rs,mid+1,r);
}
void pushup(int i)//区间维护
{
if(q[i].s)
{
q[i].len=x[q[i].r+1]-x[q[i].l];
}
else if(q[i].l==q[i].r)//这是一个点不是线段
{
q[i].len=0;
}
else
{
q[i].len=q[ls].len+q[rs].len;
}
}
void update(int i,int l,int r,int xx)//这里深刻体会为什么下边为1,上边为-1
{
//下边插入边,上边删除边
if(q[i].l==l&&q[i].r==r)
{
q[i].s+=xx;
pushup(i);
return ;
}
int mid=m(i);
if(r<=mid)
update(ls,l,r,xx);
else if(l>mid)
update(rs,l,r,xx);
else
{
update(ls,l,mid,xx);
update(rs,mid+1,r,xx);
}
pushup(i);
}
int main()
{
int n;
int kas=0;
while(~scanf("%d",&n)&&n)
{
int tot=0;
for(int i=0; i<n; i++)
{
double x1,x2,y1,y2;
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
Edge &t1=e[tot];
Edge&t2=e[1+tot];
t1.l=t2.l=x1;
t1.r=t2.r=x2;
t1.h=y1;
t1.f=1;
t2.h=y2;
t2.f=-1;
x[tot]=x1;
x[tot+1]=x2;
tot+=2;
}
sort(e,e+tot,cmp);
sort(x,x+tot);
//离散化横坐标
int k=1;
for(int i=1;i<tot;i++)
{
if(x[i]!=x[i-1])
{
x[k++]=x[i];
}
}
build(1,0,k-1);
double ans=0.0;
for(int i=0;i<tot;i++)
{
int l=lower_bound(x,x+k,e[i].l)-x;
int r=lower_bound(x,x+k,e[i].r)-x-1;
update(1,l,r,e[i].f);
ans+=(e[i+1].h-e[i].h)*q[1].len;
} printf("Test case #%d\n",++kas);
printf("Total explored area: %.2f\n\n",ans);=
}
}