poj 1389

来源:互联网 发布:外贸原单皮鞋淘宝店 编辑:程序博客网 时间:2024/06/16 03:44

求矩形的面积并

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn=1101;int ans;struct{    int l,r,x;    int y1,y2;    bool ture;    int count;}tr[10000];struct data{    int x,y1,y2,count;    bool operator <(const data &xx) const    {        return(x<xx.x);    }}d[maxn*2];int y[maxn*2];int maketree(int t,int l,int r){    tr[t].l=l;    tr[t].r=r;    tr[t].y1=y[l];    tr[t].y2=y[r];    tr[t].ture=1;    tr[t].count=0;    if(l+1==r)    return(0);    int mid=(l+r)/2;    maketree(t*2,l,mid);    maketree(t*2+1,mid,r);}int pushdown(int t){    tr[t*2].x=tr[t].x;    tr[t*2].count=tr[t].count;    tr[t*2+1].x=tr[t].x;    tr[t*2+1].count=tr[t].count;}int insert(int t,int y1,int y2,data &d){    if(tr[t].y1==y1&&tr[t].y2==y2)    {        if(tr[t].ture)        {            if(tr[t].count>0)            {                int txt=y2-y1;                ans+=txt*(d.x-tr[t].x);            }            tr[t].count+=d.count;            tr[t].x=d.x;            return(0);        }    }    if(tr[t].ture)    pushdown(t);    tr[t].ture=0;    int mid=(tr[t].l+tr[t].r)/2;    mid=y[mid];            if(mid<=y1)            insert(t*2+1,y1,y2,d);            else if(y2<=mid)            insert(t*2,y1,y2,d);            else            {                insert(t*2,y1,mid,d);                insert(t*2+1,mid,y2,d);            }}int main(){    int n;    while(1)    {        int x1,x2,y1,y2;        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);        if(x1==-1&&y1==-1&&x2==-1&&y2==-1)        break;        d[1].x=x1;        d[1].y1=y1;        d[1].y2=y2;        d[2].x=x2;        d[2].y1=y1;        d[2].y2=y2;        d[1].count=1;        d[2].count=-1;        y[1]=y1;        y[2]=y2;        for(int i=2;;i++)        {            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);            int now=2*i-1,next=now+1;            d[now].x=x1;            d[now].y1=y1;            d[now].y2=y2;            d[next].x=x2;            d[next].y1=y1;            d[next].y2=y2;            d[now].count=1;            d[next].count=-1;            y[now]=y1;            y[next]=y2;            if(x1==-1&&y1==-1&&x2==-1&&y2==-1)            {                n=i-1;                break;            }        }        sort(y+1,y+2*n+1);        sort(d+1,d+2*n+1);        maketree(1,1,2*n);        ans=0;        for(int i=1;i<=2*n;i++)        {            insert(1,d[i].y1,d[i].y2,d[i]);//            printf("%d %d\n",d[i].x,ans);        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击