poj 2777 Count Color

该题是个大水体。在这里我设一个color(相当于lazy)来记录这个区间改变的颜色,在更新的时候,我是把值往下更新的,这样就可以保证下面颜色改变同时也可以对下次的颜色改变没影响;

这里我设立了一个全局变量Color[]里面的每个值代表一种颜色,false代表不存在,true代表存在;我们往下搜索的时候如果遇到color不为零时我没就把Color[color]=true;赋值之后就不要往下搜索因为color已经代表这个区间了;最后来个暴力搜索所有的出现的颜色;

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
class Node
{
public:
int l,r,mid;
int color;
};
Node tree[400024];
bool Color[35];
class Tree
{
public:
void Maketree( int l ,int r, int cnt );
void Updata( int l,int r,int cnt ,int color );
void fun( int cnt );
void Query( int l, int r, int cnt );
};
void Tree::Maketree( int l, int r, int cnt )
{
tree[cnt].l = l;
tree[cnt].r = r;
tree[cnt].mid = ( l + r )>>1;
tree[cnt].color = 1;
if( l == r ) return ;
Maketree( l ,tree[cnt].mid , cnt*2 );
Maketree( tree[cnt].mid + 1 , r ,cnt*2 + 1 );
}
void Tree::fun( int cnt )
{
tree[cnt*2].color = tree[cnt*2+1].color = tree[cnt].color;
tree[cnt].color = 0;
}
void Tree::Updata( int l, int r, int cnt ,int color)
{
if( l>tree[cnt].r||r<tree[cnt].l )
return;
if( l<=tree[cnt].l&&tree[cnt].r<=r )
{
tree[cnt].color = color;
return ;
}
if( tree[cnt].color )
fun( cnt );
Updata( l , r ,cnt*2 , color );
Updata( l ,r ,cnt*2+1 ,color );
}
void Tree::Query( int l, int r,int cnt )
{
if( l>tree[cnt].r||r<tree[cnt].l )
return;
if( tree[cnt].color )
{
Color[tree[cnt].color]=true;
return;
}
else
{
if( tree[cnt].color )
fun( cnt );
Query( l, r ,2*cnt );
Query( l ,r ,2*cnt+1 );
}
}
int main( )
{
int n,m,Q,l,r,num;
char c[5];
while( scanf( "%d%d%d",&n,&m,&Q )==3 )
{
Tree e;
e.Maketree(1 , n , 1 );
while( Q-- )
{
scanf( "%s",c );
if( c[0]=='C' )
{
scanf( "%d%d%d",&l,&r,&num );
e.Updata( l ,r ,1,num );
}
else
{
memset( Color , 0 ,sizeof( Color ) );
scanf( "%d%d",&l,&r );
e.Query( l,r,1 );
// printf( "dsdf" );
int cnt = 0;
for( int i=1; i<=m ;i++ )
if( Color[i] ) cnt++;
printf( "%d\n",cnt );
}
}
}
return 0;
}

 

你可能感兴趣的:(count)