• HDU 4419 Colourful Rectangle 第37届ACM/ICPC 杭州赛区网络赛 1010题 (线段树)


    Colourful Rectangle

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 12    Accepted Submission(s): 3


    Problem Description
    We use Red, Green and Blue to make new colours. See the picture below:


    Now give you n rectangles, the colour of them is red or green or blue. You have calculate the area of 7 different colour. (Note: A region may be covered by same colour several times, but it’s final colour depends on the kinds of different colour)
     
    Input
    The first line is an integer T(T <= 10), the number of test cases. The first line of each case contains a integer n (0 < n <= 10000), the number of rectangles. Then n lines follows. Each line start with a letter C(R means Red, G means Green, B means Blue) and four integers x1, y1, x2, y2(0 <= x1 < x2 < 10^9, 0 <= y1 < y2 < 10^9), the left-bottom's coordinate and the right-top's coordinate of a rectangle.
     
    Output
    For each case, output a line "Case a:", a is the case number starting from 1,then 7 lines, each line contain a integer, the area of each colour. (Note: You should print the areas as the order: R, G, B, RG, RB, GB, RGB).
     
    Sample Input
    3 2 R 0 0 2 2 G 1 1 3 3 3 R 0 0 4 4 G 2 0 6 4 B 0 2 6 6 3 G 2 0 3 8 G 1 0 6 1 B 4 2 7 7
     
    Sample Output
    Case 1: 3 3 0 1 0 0 0 Case 2: 4 4 12 4 4 4 4 Case 3: 0 12 15 0 0 0 0
     
    Source
     
    Recommend
    liuyiding
     
     
     
    麻烦的线段树。写了很久啊
     
    //1010
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    using namespace std;
    const int MAXN=60010;
    
    
    struct Node
    {
        int l,r;
        int cr,cg,cb;
        int lf,rf;
        int lr,lg,lb,lrg,lrb,lgb,lrgb;
        int lw;
    }segTree[MAXN*6];
    struct Line
    {
        int x;
        int y1,y2;
        int flag;
        int f;
    }line[MAXN];
    int y[MAXN];
    bool cmp(Line a,Line b)
    {
        return a.x<b.x;
    }
    void Build(int i,int l,int r)
    {
        segTree[i].l=l;
        segTree[i].r=r;
        segTree[i].lf=y[l];
        segTree[i].rf=y[r];
        segTree[i].cr=segTree[i].cg=segTree[i].cb=0;
        segTree[i].lw=segTree[i].rf-segTree[i].lf;
        segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=segTree[i].lrgb=0;
        if(l+1==r)return;
        int mid=((l+r)>>1);
        Build(i<<1,l,mid);
        Build((i<<1)|1,mid,r);
    }
    void calc(int i)
    {
    
        if(segTree[i].l+1==segTree[i].r)
        {
             if(segTree[i].cr>0&&segTree[i].cg>0&&segTree[i].cb>0)
             {
                segTree[i].lrgb=segTree[i].rf-segTree[i].lf;
                segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=0;
                segTree[i].lw=0;
             }
             else if(segTree[i].cr>0&&segTree[i].cg>0)
             {
                segTree[i].lrg=segTree[i].rf-segTree[i].lf;
                segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrgb=segTree[i].lgb=segTree[i].lrb=0;
                segTree[i].lw=0;
             }
             else if(segTree[i].cr>0&&segTree[i].cb>0)
             {
                segTree[i].lrb=segTree[i].rf-segTree[i].lf;
                segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrgb=segTree[i].lgb=segTree[i].lrg=0;
                segTree[i].lw=0;
             }
             else if(segTree[i].cg>0&&segTree[i].cb>0)
             {
                segTree[i].lgb=segTree[i].rf-segTree[i].lf;
                segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrgb=segTree[i].lrb=segTree[i].lrg=0;
                segTree[i].lw=0;
             }
             else if(segTree[i].cr>0)
             {
                 segTree[i].lr=segTree[i].rf-segTree[i].lf;
                 segTree[i].lg=segTree[i].lb=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=segTree[i].lrgb=0;
                 segTree[i].lw=0;
             }
             else if(segTree[i].cg>0)
             {
                 segTree[i].lw=0;
                 segTree[i].lg=segTree[i].rf-segTree[i].lf;
                 segTree[i].lr=segTree[i].lb=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=segTree[i].lrgb=0;
             }
             else if(segTree[i].cb>0)
             {
                 segTree[i].lb=segTree[i].rf-segTree[i].lf;
                 segTree[i].lw=0;
                 segTree[i].lg=segTree[i].lr=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=segTree[i].lrgb=0;
             }
             else
             {
                 segTree[i].lb=0;
                 segTree[i].lw=segTree[i].rf-segTree[i].lf;
                 segTree[i].lg=segTree[i].lr=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=segTree[i].lrgb=0;
             }
             return;
        }
    
        if(segTree[i].cr>0&&segTree[i].cg>0&&segTree[i].cb>0)
        {
            segTree[i].lrgb=segTree[i].rf-segTree[i].lf;
            segTree[i].lr=segTree[i].lg=segTree[i].lb=segTree[i].lrg=segTree[i].lgb=segTree[i].lrb=0;
            segTree[i].lw=0;
            return;
        }
    
        else  if(segTree[i].cr>0&&segTree[i].cg>0)
        {
                segTree[i].lr=0;
                segTree[i].lg=0;
                segTree[i].lw=0;
                segTree[i].lb=0;
                segTree[i].lrg=segTree[i<<1].lw+segTree[(i<<1)|1].lw+segTree[i<<1].lr+segTree[(i<<1)|1].lr
                +segTree[i<<1].lg+segTree[(i<<1)|1].lg
                +segTree[i<<1].lrg+segTree[(i<<1)|1].lrg;
                segTree[i].lrb=segTree[i].lgb=0;
                segTree[i].lrgb=segTree[i<<1].lb+segTree[i<<1].lrb+segTree[i<<1].lgb+segTree[i<<1].lrgb
                +segTree[(i<<1)|1].lb+segTree[(i<<1)|1].lrb+segTree[(i<<1)|1].lgb+segTree[(i<<1)|1].lrgb;
        }
        else if(segTree[i].cr>0&&segTree[i].cb>0)
        {
                segTree[i].lr=0;
                segTree[i].lg=0;
                segTree[i].lw=0;
                segTree[i].lb=0;
                segTree[i].lrb=segTree[i<<1].lw+segTree[(i<<1)|1].lw+segTree[i<<1].lr+segTree[(i<<1)|1].lr
                +segTree[i<<1].lb+segTree[(i<<1)|1].lb
                +segTree[i<<1].lrb+segTree[(i<<1)|1].lrb;
                segTree[i].lrg=segTree[i].lgb=0;
                segTree[i].lrgb=segTree[i<<1].lg+segTree[i<<1].lgb+segTree[i<<1].lrg+segTree[i<<1].lrgb
                +segTree[(i<<1)|1].lg+segTree[(i<<1)|1].lgb+segTree[(i<<1)|1].lrg+segTree[(i<<1)|1].lrgb;
        }
        else if(segTree[i].cg>0&&segTree[i].cb>0)
        {
            segTree[i].lr=0;
                segTree[i].lg=0;
                segTree[i].lw=0;
                segTree[i].lb=0;
                segTree[i].lgb=segTree[i<<1].lw+segTree[(i<<1)|1].lw+segTree[i<<1].lg+segTree[(i<<1)|1].lg
                +segTree[i<<1].lb+segTree[(i<<1)|1].lb
                +segTree[i<<1].lgb+segTree[(i<<1)|1].lgb;
                segTree[i].lrg=segTree[i].lrb=0;
                segTree[i].lrgb=segTree[i<<1].lr+segTree[i<<1].lrb+segTree[i<<1].lrg+segTree[i<<1].lrgb
                +segTree[(i<<1)|1].lr+segTree[(i<<1)|1].lrb+segTree[(i<<1)|1].lrg+segTree[(i<<1)|1].lrgb;
        }
        else if(segTree[i].cr>0)
        {
            segTree[i].lr=segTree[i<<1].lw+segTree[i<<1].lr
               +segTree[(i<<1)|1].lw+segTree[(i<<1)|1].lr;
            segTree[i].lw=segTree[i].lg=segTree[i].lb=0;
            segTree[i].lgb=0;
    
            segTree[i].lrg=segTree[i<<1].lg+segTree[i<<1].lrg
                +segTree[(i<<1)|1].lg+segTree[(i<<1)|1].lrg;
            segTree[i].lrb=segTree[i<<1].lb+segTree[i<<1].lrb
                +segTree[(i<<1)|1].lb+segTree[(i<<1)|1].lrb;
            segTree[i].lrgb=segTree[i<<1].lgb+segTree[i<<1].lrgb
               +segTree[(i<<1)|1].lgb+segTree[(i<<1)|1].lrgb;
        }
        else if(segTree[i].cg>0)
        {
            segTree[i].lg=segTree[i<<1].lw+segTree[i<<1].lg
               +segTree[(i<<1)|1].lw+segTree[(i<<1)|1].lg;
            segTree[i].lw=segTree[i].lr=segTree[i].lb=0;
            segTree[i].lrb=0;
    
            segTree[i].lrg=segTree[i<<1].lr+segTree[i<<1].lrg
                +segTree[(i<<1)|1].lr+segTree[(i<<1)|1].lrg;
            segTree[i].lgb=segTree[i<<1].lb+segTree[i<<1].lgb
                +segTree[(i<<1)|1].lb+segTree[(i<<1)|1].lgb;
            segTree[i].lrgb=segTree[i<<1].lrb+segTree[i<<1].lrgb
               +segTree[(i<<1)|1].lrb+segTree[(i<<1)|1].lrgb;
        }
        else if(segTree[i].cb>0)
        {
            segTree[i].lb=segTree[i<<1].lw+segTree[i<<1].lb
               +segTree[(i<<1)|1].lw+segTree[(i<<1)|1].lb;
            segTree[i].lw=segTree[i].lr=segTree[i].lg=0;
            segTree[i].lrg=0;
    
            segTree[i].lrb=segTree[i<<1].lr+segTree[i<<1].lrb
                +segTree[(i<<1)|1].lr+segTree[(i<<1)|1].lrb;
            segTree[i].lgb=segTree[i<<1].lg+segTree[i<<1].lgb
                +segTree[(i<<1)|1].lg+segTree[(i<<1)|1].lgb;
            segTree[i].lrgb=segTree[i<<1].lrg+segTree[i<<1].lrgb
               +segTree[(i<<1)|1].lrg+segTree[(i<<1)|1].lrgb;
        }
        else
        {
            segTree[i].lw=segTree[i<<1].lw+segTree[(i<<1)|1].lw;
            segTree[i].lr=segTree[i<<1].lr+segTree[(i<<1)|1].lr;
            segTree[i].lg=segTree[i<<1].lg+segTree[(i<<1)|1].lg;
            segTree[i].lb=segTree[i<<1].lb+segTree[(i<<1)|1].lb;
    
            segTree[i].lrg=segTree[i<<1].lrg+segTree[(i<<1)|1].lrg;
            segTree[i].lgb=segTree[i<<1].lgb+segTree[(i<<1)|1].lgb;
            segTree[i].lrb=segTree[i<<1].lrb+segTree[(i<<1)|1].lrb;
    
            segTree[i].lrgb=segTree[i<<1].lrgb+segTree[(i<<1)|1].lrgb;
        }
    
    }
    void update(int i,Line e)
    {
        if(e.y1==segTree[i].lf&&e.y2==segTree[i].rf)
        {
            if(e.flag==1)
            {
                segTree[i].cr+=e.f;
            }
            else if(e.flag==2)
            {
                segTree[i].cg+=e.f;
            }
            else if(e.flag==3)
            {
                segTree[i].cb+=e.f;
            }
            //printf("*%d %d\n",segTree[i].lf,segTree[i].rf);
           // printf("**%d %d %d\n",segTree[i].cr,segTree[i].cg,segTree[i].cb);
            calc(i);
            return;
        }
        if(e.y2<=segTree[i<<1].rf) update(i<<1,e);
        else if(e.y1>=segTree[(i<<1)|1].lf)  update((i<<1)|1,e);
        else
        {
            Line temp=e;
            temp.y2=segTree[i<<1].rf;
            update(i<<1,temp);
            temp=e;
            temp.y1=segTree[(i<<1)|1].lf;
            update((i<<1)|1,temp);
        }
        calc(i);
    }
    long long out[20];
    int main()
    {
           // freopen("J.in","r",stdin);
       // freopen("J.out","w",stdout);
        int x1,x2,y1,y2;
        char str[10];
        int T;
        int n;
        scanf("%d",&T);
        int iCase=0;
        while(T--)
        {
            iCase++;
            scanf("%d",&n);
            int t=1;
            for(int i=1;i<=n;i++)
            {
                scanf("%s",&str);
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                line[t].x=x1;
                line[t].y1=y1;
                line[t].y2=y2;
                line[t].f=1;
                if(str[0]=='R')line[t].flag=1;
                else if(str[0]=='G')line[t].flag=2;
                else line[t].flag=3;
    
    
                y[t]=y1;
                t++;
                line[t].x=x2;
                line[t].y1=y1;
                line[t].y2=y2;
                line[t].f=-1;
                y[t]=y2;
                if(str[0]=='R')line[t].flag=1;
                else if(str[0]=='G')line[t].flag=2;
                else line[t].flag=3;
                t++;
            }
    
            sort(line+1,line+t,cmp);
            sort(y+1,y+t);
            Build(1,1,t-1);
            memset(out,0,sizeof(out));
            update(1,line[1]);
    
    
            for(int i=2;i<t;i++)
            {
                out[1]+=(long long)segTree[1].lr*(line[i].x-line[i-1].x);
                out[2]+=(long long)segTree[1].lg*(line[i].x-line[i-1].x);
                out[3]+=(long long)segTree[1].lb*(line[i].x-line[i-1].x);
                out[4]+=(long long)segTree[1].lrg*(line[i].x-line[i-1].x);
                out[5]+=(long long)segTree[1].lrb*(line[i].x-line[i-1].x);
                out[6]+=(long long)segTree[1].lgb*(line[i].x-line[i-1].x);
                out[7]+=(long long)segTree[1].lrgb*(line[i].x-line[i-1].x);
                update(1,line[i]);
    
            }
            printf("Case %d:\n",iCase);
    
    
            for(int i=1;i<=7;i++)
              printf("%I64d\n",out[i]);
        }
        return 0;
    }
  • 相关阅读:
    uni-app下[manifest.json][h5.router.base]优先于vue.config.js下的publicPath
    vue.config.js[publicPath],Webpack[publicPath],process.env[BASE_URL],vue.router[base],uni-app[manifest.json][h5.router.base]
    vue中mode,.env,.env[mode],配置文件,process.env.NODE_ENV
    vue使用bpmn流程管理器
    element-ui 调试 el-select不能正常工作 不报错
    VUE用浏览器调用USB摄像头
    2020最新版《神经网络与深度学习》中文版
    《推荐系统实践》 高清版 下载
    《推荐算法在业界的应用实践合集》 PDf 下载
    《机器学习》周志华-西瓜书 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2699026.html
Copyright © 2020-2023  润新知