IT民工
加油!

颜色种类不大于三十,可以用二进制来加速。每个二进制代表一种颜色,用位或运

算来更新颜色记录,最后求和只要看结果有几个二进制为1就行。

/*Accepted    2224K    297MS    C++    2156B    2012-07-24 16:39:26*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int MAXN = 100011;
int sum[MAXN << 2];
int col[MAXN << 2];
int L, T, O;

void PushUp(int rt)
{
    sum[rt] = sum[rt << 1] | sum[rt << 1 | 1];
}

void build( int l, int r, int rt)
{
    int m = (l + r) >> 1;
    col[rt] = 0;
    if( l == r)
    {
        sum[rt] = 1;
        return;
    }
    build(lson);
    build(rson);
    PushUp(rt);
}

void PushDown( int rt)
{
    if(col[rt]){
        col[rt << 1] = col[rt << 1 | 1] = col[rt];
        sum[rt << 1] = sum[rt << 1 | 1] = 1 << ( col[rt] - 1);
        col[rt] = 0;
    }
}

void update( int L, int R, int c, int l, int r, int rt)
{
    int m = (l + r) >> 1;
    if( L <= l && r <= R)
    {
        col[rt] = c;
        sum[rt] = 1 << (c - 1);
        return;
    }
    PushDown(rt);
    if( L <= m) update( L, R, c, lson);
    if( R > m) update( L, R, c, rson);
    PushUp(rt);
}

int query( int L, int R, int l, int r, int rt)
{
    int ret = 0, m = (l + r) >> 1;
    if( L <= l && r <= R)
    {
        return sum[rt];
    }
    PushDown(rt);
    if( L <= m)
        ret = ret | query( L, R, lson);
    if( R > m)
        ret = ret | query( L, R, rson);
    return ret;
}

void operation()
{
    char op[2];
    int a, b, c, ret, ans;
    while( O --)
    {
        scanf( "%s", op);
        if( 'C' == op[0])
        {
            scanf( "%d%d%d", &a, &b, &c);
            if( a > b) swap(a, b);
            update( a, b, c, 1, L, 1);
        }
        else {
            ans = 0;
            scanf( "%d%d", &a, &b);
            if( a > b) swap(a, b);
            ret = query(a, b, 1, L, 1);
            while( ret)
            {
                if( ret % 2 == 1) //代表二进位为1
                    ans ++;
                ret /= 2;
            }
            printf( "%d\n", ans);
        }
    }
}

int main()
{
    while( scanf( "%d%d%d", &L, &T, &O) == 3)
    {
        build(1, L, 1);
        operation();
    }
    return 0;
}

 

 

posted on 2012-07-24 16:46  找回失去的  阅读(204)  评论(0编辑  收藏  举报