POJ 2777 Count Color
2012-07-24 16:46
232 查看
颜色种类不大于三十,可以用二进制来加速。每个二进制代表一种颜色,用位或运
算来更新颜色记录,最后求和只要看结果有几个二进制为1就行。
算来更新颜色记录,最后求和只要看结果有几个二进制为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; }
相关文章推荐
- POJ 题目2777 Count Color(线段树,区间查询染色数)
- POJ 2777 Count Color 线段树入门题
- POJ 2777 Count Color (线段树、lazy思想)
- poj 2777 count color解题报告【线段树】
- POJ 2777 Count Color (线段树区间更新)
- poj 2777 Count Color
- POJ 2777 Count Color
- POJ 2777 Count Color(线段树+懒惰标记)
- poj_2777 Count Color(线段树染色)
- POJ 2777 Count Color
- POJ 2777 Count Color (线段树的区间更新+lazy tag)
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
- POJ 2777 Count Color (线段树)
- POJ:2777-Count Color(线段树+状压)
- poj 2777 Count Color
- POJ 2777 Count Color (线段树&位运算)
- POJ 2777 Count Color
- POJ 2777 Count Color(线段树+位运算)
- Poj 2777 Count Color
- POJ 2777 Count Color