这个和poj1151一样。。。。
就是读入时候略有区别。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int tot,s_tot,q[20100],tmp_q[20100],tail,tmp_tail,ans;
struct rec
{
int l,r,lch,rch,sum,da,biao;
}tree[20100];
struct rec2
{
int h,l,r,biao;
}segment[20100];
int cmp(rec2 x,rec2 y) {return x.h<y.h;}
void clear()
{
memset(segment,0,sizeof(segment));
memset(tree,0,sizeof(tree));
memset(q,0,sizeof(q));
memset(tmp_q,0,sizeof(tmp_q));
tot=0;
s_tot=0;
tail=0;
tmp_tail=0;
ans=0;
q[0]=200000;
tmp_q[0]=200000;
}
bool Input()
{
int ci=0,x1,y1,x2,y2;
while (scanf("%d%d%d%d",&x1,&y1,&x2,&y2))
{
if (x1==-1&&x2==-1&&y1==-1&&y2==-1)
{
if (ci==0) return false;
else return true;
}
ci++;
s_tot++;
segment[s_tot].h=y1,segment[s_tot].l=x1,segment[s_tot].r=x2,segment[s_tot].biao=1;
s_tot++;
segment[s_tot].h=y2,segment[s_tot].l=x1,segment[s_tot].r=x2,segment[s_tot].biao=-1;
}
}
void maketree(int l,int r)
{
int now=++tot;
tree[now].l=l,tree[now].r=r;
if (l==r)
{
tree[now].da=q[l+1]-q[l];
return ;
}
int mid=(l+r)>>1;
tree[now].lch=tot+1;maketree(l,mid);
tree[now].rch=tot+1;maketree(mid+1,r);
tree[now].da=tree[tree[now].lch].da+tree[tree[now].rch].da;
}
void change(int x,int l,int r,int w)
{
if (tree[x].l>=l&&tree[x].r<=r)
{
tree[x].biao+=w;
if (tree[x].biao!=0) tree[x].sum=tree[x].da;
else
if (tree[x].l==tree[x].r) tree[x].sum=0;
else
tree[x].sum=tree[tree[x].lch].sum+tree[tree[x].rch].sum;
return ;
}
int mid=(tree[x].l+tree[x].r)>>1;
if (l<=mid) change(tree[x].lch,l,r,w);
if (r>mid) change(tree[x].rch,l,r,w);
if (tree[x].biao!=0) tree[x].sum=tree[x].da;
else
if (tree[x].l==tree[x].r) tree[x].sum=0;
else
tree[x].sum=tree[tree[x].lch].sum+tree[tree[x].rch].sum;
}
void pre_work()
{
for (int i=1;i<=s_tot;i++)
{
tmp_q[++tmp_tail]=segment[i].l;
tmp_q[++tmp_tail]=segment[i].r;
}
sort(tmp_q+1,tmp_q+tmp_tail+1);
for (int i=1;i<=tmp_tail;i++)
if (tmp_q[i-1]!=tmp_q[i])
q[++tail]=tmp_q[i];
maketree(1,tail-1);
sort(segment+1,segment+s_tot+1,cmp);
}
void work()
{
int l,r;
for (int i=1;i<=s_tot;i++)
{
if (segment[i].h!=segment[i-1].h)
ans+=tree[1].sum*(segment[i].h-segment[i-1].h);
l=lower_bound(q+1,q+tail+1,segment[i].l)-q;
r=lower_bound(q+1,q+tail+1,segment[i].r)-q;
change(1,l,r-1,segment[i].biao);
}
}
int main()
{
freopen("poj1389.in","r",stdin);
freopen("poj1389.out","w",stdout);
clear();
for (;Input();)
{
pre_work();
work();
printf("%d\n",ans);
clear();
}
}