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]);
    }
}



















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

原文地址:https://www.cnblogs.com/zfyouxi/p/4744634.html