现在的位置: 首页 > 综合 > 正文

POJ 2777

2014年11月08日 ⁄ 综合 ⁄ 共 1585字 ⁄ 字号 评论关闭
思路:线段树,每个节点记录是否当前区间只被一种颜色覆盖,如果是就将此颜色记录下来,如果不是,说明不是单色区间,那么就继续寻找其子区间,直到找到单色区间为止。其实很简单,因为整个区间必定是由一个个单色区间组成的!!!一开始这题提交的时候超时了,很费解,后来我把全局变量mid改成局部变量居然过了,不知道为什么,难道CPU对这两者的访问效率不同?反正很费解。。。,以后注意吧,少用全局变量。

#include<stdio.h>
#include<string.h>
#define L(x) (x << 1)
#define R(x) (x << 1|1)
#define MAX 100000
#define T 40
typedef struct
{
    int l,r;
    int cover;
}Node;
Node node[3*MAX];
int color[T];
int sum;
void build(int l,int r,int k)
{
    node[k].l = l;
    node[k].r = r;
    if(l == r)
        return ;
    int mid = (l+r) >> 1;
    build(l,mid,L(k));
    build(mid+1,r,R(k));
}

void insert(int l,int r,int clr,int k)
{
    if(l <= node[k].l && r >= node[k].r)
    {
        node[k].cover = clr;
        return ;
    }
    else
    {
        if(node[k].cover > 0)
        {
            node[L(k)].cover = node[k].cover;
            node[R(k)].cover = node[k].cover;
            node[k].cover = 0;
        }
        if(l > node[L(k)].r)
            insert(l,r,clr,R(k));
        else if(r <= node[L(k)].r)
            insert(l,r,clr,L(k));
        else
        {
            insert(l,node[L(k)].r,clr,L(k));
            insert(node[R(k)].l,r,clr,R(k));
        }
    }
}

void get_result(int l,int r,int k)
{
    if(node[k].cover > 0)
    {
        color[node[k].cover] = 1;
    }
    else
    {
        if(l > node[L(k)].r)
            get_result(l,r,R(k));
        else if(r <= node[L(k)].r )
            get_result(l,r,L(k));
        else
        {
            get_result(l,node[L(k)].r,L(k));
            get_result(node[R(k)].l,r,R(k));
        }
    }
}

int main()
{
    int n,t,m,i,j;
    int a,b,c,d,e;
    char str[5];
    //freopen("in.c","r",stdin);
    while(~scanf("%d%d%d",&n,&t,&m))
    {
        memset(str,0,sizeof(str));
        memset(color,0,sizeof(color));
        build(1,n,1);
        node[1].cover = 1;
        for(i = 1;i <= m;i ++)
        {
            scanf("%s",str);
            if(!strcmp(str,"C"))
            {
                scanf("%d%d%d",&a,&b,&c);
                d = a < b?a:b;
                e = a > b?a:b;
                insert(d,e,c,1);
            }
            if(!strcmp(str,"P"))
            {
                sum = 0;
                scanf("%d%d",&a,&b);
                memset(color,0,sizeof(color));
                d = a < b?a:b;
                e = a > b?a:b;
                get_result(d,e,1);
                for(j = 1;j <= t;j ++)
                {
                    if(color[j])
                        sum ++;
                }
                printf("%d\n",sum);
            }
            memset(str,0,sizeof(str));
        }
    }
    return 0;
}

抱歉!评论已关闭.