hdu 3265 Posters

hdu 3265 Posters

天呐,这算什么啊?

 ans+=1ll*len[1]*(ss[i+1].x-ss[i].x);//这里忘了转成long long型了,结果改了一整晚,可是之前没碰过需要转的呀(不解,求解释),orz!!

半信半疑的改完提交了,结果真的过了,再把之前的代码改了一下,还是过了,郁闷!!!

题意:同样是求N个矩形的面积并,只不过,矩形中间存在一个空矩形……

最直观的方法就是将一个带空矩形的矩形分成四个矩形,再按照求面积并的方法求一遍就是了,需要离散化的

#include<iostream>
#include<algorithm>
#define maxn 200100
using namespace std;
struct node
{
    int x,y1,y2,s;
    node(int a=0,int b=0,int c=0,int d=0):x(a),y1(b),y2(c),s(d){}
    friend bool operator<(const node a,const node b)
    {
        return a.x<b.x;
    }
};
bool cmp(node a,node b)
{
    return a.x<b.x;
}
node ss[maxn*4];
struct node1
{
    int l,r;
}p[maxn<<1];
int len[maxn<<1],cnt[maxn<<1];
int map1[maxn<<1];
void build(int k,int s,int t)
{
    p[k].l=s;
    p[k].r=t;
    if(s==t)
        return ;
    int kl=k<<1,kr=kl+1,mid=(s+t)>>1;
    build(kl,s,mid);
    build(kr,mid+1,t);
}
void PushUp(int k)
{
    if(cnt[k])
        len[k]=map1[p[k].r+1]-map1[p[k].l];
    else if(p[k].l==p[k].r)
        len[k]=0;
    else len[k]=len[k<<1]+len[k<<1|1];
}
void update(int l,int r,int c,int k)
{
    if(l<=p[k].l &&p[k].r<=r)
    {
        cnt[k]+=c;
        PushUp(k);
        return ;
    }
    int kl=k<<1,kr=kl+1,mid=(p[k].l+p[k].r)>>1;
    if(l<=mid)
        update(l,r,c,kl);
    if(r>mid)
        update(l,r,c,kr);
    PushUp(k);
}
int Bin(int key,int n,int map1[]) {  
    int l = 0 , r = n - 1;  
    while (l <= r)   
    {  
       int mid = (l + r) >> 1;  
        if (map1[mid] == key) return mid;  
        if (map1[mid] < key) l = mid + 1;  
        else r = mid - 1;  
    }  
    return -1;  
}

int main()
{
    int n;
    int x1,x2,x3,x4,y1,y2,y3,y4;
    while(scanf("%d",&n)==1 &&n)
    {
        int m=0,cn=0;
        while(n--)
        {
            scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
            ss[m++]=node(x1,y1,y2,1);
            ss[m++]=node(x3,y1,y2,-1);
            ss[m++]=node(x3,y4,y2,1);
            ss[m++]=node(x2,y4,y2,-1);
            ss[m++]=node(x4,y3,y4,1);
            ss[m++]=node(x2,y3,y4,-1);
            ss[m++]=node(x3,y1,y3,1);
            ss[m++]=node(x2,y1,y3,-1);
            map1[cn++]=y1;map1[cn++]=y2;map1[cn++]=y3;map1[cn++]=y4;
        }
        sort(ss,ss+m,cmp);
        sort(map1,map1+cn);
        int k=1;
        for (int i = 1 ; i < cn ; i ++)   
            if (map1[i] != map1[i-1])  
                map1[k++] =map1[i];  
        memset(len,0,sizeof(len));
        memset(cnt,0,sizeof(cnt));
        build(1,0,k-1);
        __int64 ans=0;
        for(int i=0;i<m-1;i++)
        {
            int l=Bin(ss[i].y1,k,map1);
            int r=Bin(ss[i].y2,k,map1)-1;
            if(l<=r)
            update(l,r,ss[i].s,1);
            ans+=1ll*len[1]*(ss[i+1].x-ss[i].x);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

        


posted @ 2011-10-03 02:15  枕边梦  阅读(175)  评论(0编辑  收藏  举报