题目传送门
一、题目大意
一条很长(\(L\))的画板,有\(T\)种颜色,\(O\)个操作;每次操作将一个区间刷成一种颜色,或者查询一个区间内所含的颜色数。
二、题目分析
经典的区间染色问题。
因为总共的颜色最多只有\(30\)种,因此我们可以用一个范围在\(int\)的二进制数\(bit\)存储每一种颜色(\(bit\)的二进制下的每一位代表着一种颜色)
之后我们只需要用线段树对区间上的\(bit\)进行维护即可。注意在我们区间合并\(pushup\)的过程中,我们需要将某个结点的左右儿子的值都或起来,作为该结点的值。
之后对于操作\(C\),我们只需要将区间\([l,r]\)的值更新即可。
对于操作\(Q\),我们只需要将区间\([l,r]\)的\(bit\)求出,并求出\(bit\)在二进制位下的\(1\)的个数为答案。
ps:这个问题种还有一个坑点,对于每一个操作种的\(l\)和\(r\),题目中并没有说明哪个是左区间,哪个是有区间,因此我们还需要特判一下大小。
三、实现代码
// http://poj.org/problem?id=2777
#include
#include
#include
#include
#include