poj 2777 -- Count Color ( 线段树 )
2013-03-21 12:18
316 查看
WA了两天后终于A掉了,好开心, 按自己的理解实现的lazy ,实现上可能麻烦点 , 效率也略低 ,等看看别人代码学习下
# include <cstdio> # include <iostream> # include <set> # include <map> # include <vector> # include <list> # include <queue> # include <stack> # include <cstring> # include <string> # include <cstdlib> # include <cmath> # include <algorithm> using namespace std ; const int maxn = 110000 ; struct Tree { int flag ; bool hash [ 31 ] ; int sum ; } tree [ maxn * 4 ] ; bool tm [ 31 ] ; int t ; void pushup ( int pos ) { for ( int i = 1 ; i <= t ; i ++ ) { tree [ pos ] . hash [ i ] = ( tree [ pos * 2 ] . hash [ i ] || tree [ pos * 2 + 1 ] . hash [ i ] ) ; } } void pushdown ( int pos ) { tree [ pos * 2 ] . flag = 1 ; tree [ pos * 2 + 1 ] . flag = 1 ; for ( int i = 1 ; i <= t ; i ++ ) { tree [ pos * 2 ] . hash [ i ] = tree [ pos * 2 + 1 ] . hash [ i ] = tree [ pos ] . hash [ i ] ; } } void build ( int l , int r , int pos ) { tree [ pos ] . sum = 1 ; tree [ pos ] . hash [ 1 ] = 1 ; if ( l == r ) return ; int m = ( l + r ) / 2 ; build ( l , m , pos * 2 ) ; build ( m + 1 , r , pos * 2 + 1 ) ; } void update ( int l , int r , int pos , int L , int R , int C ) { if ( l >= L && r <= R ) { memset ( tree [ pos ] . hash , 0 , sizeof ( tree [ pos ] . hash ) ) ; tree [ pos ] . hash [ C ] = 1 ; tree [ pos ] . flag = 1 ; return ; } //cout << l << ' ' << r << ' ' << C << endl ; if ( tree [ pos ] . flag ) { tree [ pos ] . flag = 0 ; pushdown ( pos ) ; } int m = ( l + r ) / 2 ; if ( m >= L ) update ( l , m , pos * 2 , L , R , C ) ; if ( m + 1 <= R ) update ( m + 1 , r , pos * 2 + 1 , L , R , C ) ; pushup ( pos ) ; } void quer ( int l , int r , int pos , int L , int R ) { //cout << l << ' ' << r << ' ' ; if ( l >= L && r <= R || tree [ pos ] . flag ) { for ( int i = 1 ; i <= t ; i ++ ) { tm [ i ] = ( tm [ i ] || tree [ pos ] . hash [ i ] ) ; } return ; } int m = ( l + r ) / 2 ; if ( m >= L ) quer ( l , m , pos * 2 , L , R ) ; if ( m + 1 <= R ) quer ( m + 1 , r , pos * 2 + 1 , L , R ) ; } int main ( ) { int n , q ; while ( ~ scanf ( "%d%d%d" , & n , & t , & q ) ) { memset ( tree , 0 , sizeof ( tree ) ) ; getchar ( ) ; build ( 1 , n , 1 ) ; while ( q -- ) { char c ; c = getchar ( ) ; if ( c == 'C' ) { int x , y , z ; scanf ( "%d%d%d" , & x , & y , & z ) ; update ( 1 , n , 1 , min ( x , y ) , max ( x , y ) , z ) ; } else { int x , y ; scanf ( "%d%d" , & x , & y ) ; memset ( tm , 0 , sizeof ( tm ) ) ; quer ( 1 , n , 1 , min ( x , y ) , max ( x , y ) ) ; int num = 0 ; for ( int i = 1 ; i <= t ; i ++ ) if ( tm [ i ] ) { num ++ ; // cout << i << endl ; } printf ( "%d\n" , num ) ; } getchar ( ) ; } } }
相关文章推荐
- 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 (线段树、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 (线段树区间修改 + 状态压缩)
- Poj 2777 Count Color(线段树基础)
- poj 2777 Count Color(线段树、状态压缩、位运算)
- POJ---2777 Count Color[线段树-求整段区间]