题目:http://poj.org/problem?id=2777
题意:有长为L的格子,初始颜色为 1,有T种颜料,两种操作,共操作O次,如 “C 1 2 2”表示区间 [1,2] 涂颜料2,“P 1 3”表示询问区间 [1,3] 有几种不同的颜色。
思路:格子的颜色为 i ,则用 1 << i 来表示 。父节点的值为两个子节点进行或运算后的值。那么最后只需要对每一段对应区间的二进制的值全部 进行或运算后 ,最后再看这个二进制数中含几个 1 就是答案了。
本题两种操作输入的区间不一定L<=R,所以要判断并swap;最后的答案 不是每个符合条件(即&&
)的子区间都算出二级制中包含几个 1 并相加,那样颜色很可能会重复(代码后面的样例可以一试)。
心得:通过本题对 懒标记 lzx 有了进一步的认识。引用书中两段话:
如果更新的区间完全覆盖线段树一个结点代表的区间时,就可以仅对该结点进行更新,并且做标记,表示这个结点更新过,然后对这个结点的子结点就不再更新,尽管这个结点的子结点代表的区间一定也在更新范围内。
一个区间被更新后,以后都可以不再查询这个区间或者子区间。如果后边有关于这个区间或者子区间