您的位置:首页 > 其它

POJ 2777 Count Color

2012-07-24 16:46 232 查看
颜色种类不大于三十,可以用二进制来加速。每个二进制代表一种颜色,用位或运

算来更新颜色记录,最后求和只要看结果有几个二进制为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: