zoukankan      html  css  js  c++  java
  • 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;
    }
    
            
    


  • 相关阅读:
    SpringBoot之旅第三篇-日志
    SpringBoot之旅第二篇-配置
    SpringBoot之旅第一篇-初探
    394. 字符串解码
    1190. 反转每对括号间的子串
    921. 使括号有效的最少添加
    Leetcode 1171. 从链表中删去总和值为零的连续节点
    设计模式之过滤器模式——Java语言描述
    MySQL查询执行的基础
    设计模式之桥接模式——Java语言描述
  • 原文地址:https://www.cnblogs.com/nanke/p/2198390.html
Copyright © 2011-2022 走看看