zoukankan      html  css  js  c++  java
  • hdu-4419-Colourful Rectangle-段树区,并寻求

    这个问题很有趣的项目,写麻烦。它预计将有写了很长的时间。

    好在,我想开了一个比较简单的方法。。

    使用位计算,颜色RGB分别1,2,4,代表。

    状态的长度了。

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    #include<vector>
    #include<math.h>
    #include<map>
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    #define maxn 11000
    #define mem(a,b) (memset(a),b,sizeof(a))
    #define lmin 1
    #define rmax len
    #define lson l,(l+r)/2,rt<<1
    #define rson (l+r)/2+1,r,rt<<1|1
    #define root lmin,rmax,1
    #define now l,r,rt
    #define int_now int l,int r,int rt
    #define INF 99999999
    #define LL __int64
    #define mod 10007
    #define eps 1e-6
    #define zero(x) (fabs(x)<eps?0:x)
    map<int,int>mp;
    int du[maxn*2];
    int len;
    struct list
    {
        int x;
        int y,yy;
        int cl;
        int leap;
        friend bool operator <(const list &a,const list &b)
        {
            return a.x<b.x;
        }
    }node[maxn*2];;
    int color[maxn*4*4][8];
    int yan[maxn*4*4][3];
    void creat()
    {
        memset(color,0,sizeof(color));
        memset(yan,0,sizeof(yan));
    }
    void push_up(int_now)
    {
        int tai=0;
        for(int i=0;i<=2;i++)
            if(yan[rt][i])tai=tai|(1<<i);
        for(int i=0;i<=7;i++)color[rt][i]=0;
        int all=du[r+1]-du[l];
        for(int i=1;i<=7;i++)
        {
            color[rt][i|tai]+=color[rt<<1][i]+color[rt<<1|1][i];
        }
        for(int i=1;i<=7;i++)all-=color[rt][i];
        color[rt][tai]+=all;
    }
    void updata(int ll,int rr,int cl,int x,int_now)
    {
        if(ll>r||rr<l)return;
        if(ll<=l&&rr>=r)
        {
            yan[rt][cl]+=x;
            push_up(now);
            return;
        }
        updata(ll,rr,cl,x,lson);
        updata(ll,rr,cl,x,rson);
        push_up(now);
    }
    int main()
    {
        int T,cas;
        scanf("%d",&T);
        cas=0;
        int n,x,y,xx,yy;
        char str[1110];
        while(T--)
        {
            cas++;
            scanf("%d",&n);
            int cl;
            int ls=0;
            du[0]=-1;
            for(int i=1;i<=n;i++)
            {
                scanf("%s%d%d%d%d",str,&x,&y,&xx,&yy);
                if(str[0]=='R')cl=0;
                if(str[0]=='G')cl=1;
                if(str[0]=='B')cl=2;
                node[i*2-1].cl=cl; node[i*2-1].y=y  ; node[i*2-1].leap=1;
                node[i*2-1].x=x;   node[i*2-1].yy=yy;
                node[i*2  ].cl=cl; node[i*2  ].y=y  ; node[i*2  ].leap=-1;
                node[i*2  ].x=xx;  node[i*2  ].yy=yy;
                du[++ls]=y;
                du[++ls]=yy;
            }
            sort(node+1,node+n*2+1);
            sort(du,du+ls+1);
            len=0;
            for(int i=1;i<=ls;i++)
            {
                if(du[i]!=du[i-1])
                {
                    mp[du[i]]=++len;
                    du[len]=du[i];
                }
            }
            len--;
            LL are[8];
            int st;
            st=0;
            creat();
            memset(are,0,sizeof(are));
            for(int i=1;i<=n*2;i++)
            {
                int l=mp[node[i].y];
                int r=mp[node[i].yy];
                for(int j=1;j<=7;j++)
                {
                    are[j]+=(LL)color[1][j]*(node[i].x-st);
                }
                st=node[i].x;
                updata(l,r-1,node[i].cl,node[i].leap,root);
            }
            printf("Case %d:
    ",cas);
            printf("%I64d
    ",are[1]);
            printf("%I64d
    ",are[2]);
            printf("%I64d
    ",are[4]);
            printf("%I64d
    ",are[3]);
            printf("%I64d
    ",are[5]);
            printf("%I64d
    ",are[6]);
            printf("%I64d
    ",are[7]);
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    bootstrap入门基础
    java遇见的问题分析
    蓝桥杯练习
    win7 在文件夹上右键后 以管理员启动命令窗口
    渲染10万条数据的性能问题
    闲聊一下百度的Unit
    利用c# 多屏显示
    学习Xposed --记WX功能分析的过程
    从零开始打jar包--补充
    修改windows7 的管理员密码
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4744634.html
Copyright © 2011-2022 走看看