zoukankan      html  css  js  c++  java
  • hdu 3265 矩形剪块面积并

    http://acm.hust.edu.cn/vjudge/problem/10769

    给n张海报,在每张海报上剪掉一个矩形,求面积并

    把剪块的海报分成四个矩形,就是普通的求面积并问题了

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <vector>
    #include <iterator>
    #include <set>
    #include <map>
    #include <sstream>
    using namespace std;
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define spf sprintf
    #define pb push_back
    #define debug printf("!
    ")
    #define MAXN 50000+5
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    #define ALL(x) x.begin(),x.end()
    #define INS(x) inserter(x,x.begin())
    #define pqueue priority_queue
    #define INF 0x3f3f3f3f
    
    #define ls (rt<<1)
    #define rs (rt<<1|1)
    
    int n,m;
    
    int hh[MAXN],col[MAXN<<3],len[MAXN<<3];
    
    struct node
    {
        int l,r,x,c;
        node(){}
        node(int a,int b,int c,int d):l(a),r(b),x(c),c(d){}
        bool operator < (const node &b) const
        {
            return x<b.x;
        }
    }a[MAXN<<3];
    
    void PushUp(int rt,int l,int r)
    {
        if(col[rt])
        {
            len[rt] = hh[r+1] - hh[l];
        }
        else if(l==r) len[rt] = 0;
        else
        {
            len[rt] = len[ls]+len[rs];
        }
    }
    
    void update(int val,int L,int R,int l,int r,int rt)
    {
        if(L<=l && r<=R)
        {
            col[rt] += val;
            PushUp(rt,l,r);
            return;
        }
        int mid = (l+r)>>1;
        if(L <= mid) update(val,L,R,l,mid,ls);
        if(R > mid) update(val,L,R,mid+1,r,rs);
        PushUp(rt,l,r);
    }
    
    int main()
    {
        int i,j,k,t,kase=1;
        while(~sf("%d",&n) && n)
        {
            int v=0;
            LL sum = 0;
            for(i=0;i<n;i++)
            {
                int x1,y1,x2,y2;
                int X1,Y1,X2,Y2;
                sf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&X1,&Y1,&X2,&Y2);
                if(x1!=X1)
                {
                    hh[v] = y1;
                    a[v++] = node(y1,y2,x1,1);
                    hh[v] = y2;
                    a[v++] = node(y1,y2,X1,-1);
                }
                if(x2!=X2)
                {
                    hh[v] = y1;
                    a[v++] = node(y1,y2,X2,1);
                    hh[v] = y2;
                    a[v++] = node(y1,y2,x2,-1);
                }
                if(y1!=Y1)
                {
                    hh[v] = y1;
                    a[v++] = node(y1,Y1,X1,1);
                    hh[v] = Y1;
                    a[v++] = node(y1,Y1,X2,-1);
                }
                if(y2!=Y2)
                {
                    hh[v] = Y2;
                    a[v++] = node(Y2,y2,X1,1);
                    hh[v] = y2;
                    a[v++] = node(Y2,y2,X2,-1);
                }
            }
            sort(hh,hh+v);
            sort(a,a+v);
            int d = 1;
            for(i=1;i<v;i++)
            {
                if(hh[i]!=hh[i-1]) hh[d++] = hh[i];
            }
            mem(len,0);
            mem(col,0);
            for(i=0;i<v-1;i++)
            {
                int l = lower_bound(hh,hh+d,a[i].l)-hh;
                int r = lower_bound(hh,hh+d,a[i].r)-hh-1;
                update(a[i].c,l,r,0,d-1,1);
                sum+=len[1]*((long long)a[i+1].x-a[i].x);
                //pf("%lf %lf
    ",sum,len[1]);
            }
            pf("%I64d
    ",sum);
        }
    
        return 0;
    }
  • 相关阅读:
    Android SDK
    1055
    清除浮动的三种方式
    解决块状元素垂直外边距的塌陷问题
    drf 验证接口权限
    Linux常用指令
    Linux安装python3,virtualenv和virtualenvwrapper
    Linux基本命令2
    Linux之文档与目录结构
    Linux基本命令
  • 原文地址:https://www.cnblogs.com/qlky/p/5757877.html
Copyright © 2011-2022 走看看