線段樹區間更新,區間統計 poj 2777 Count Color
題意:
將一段長為L的板子染色,板子可分為編號為1,2,3...L的L段,總共有O次操作,操作有兩種:1.將A到B區間染為顏色C 2.詢問A到B區間有多少種顏色。顏色從1到T編號,不超過30種。
思路:1.由於顏色不超過30種,所以可以考慮位運算,每一位代表一種顏色,一個32位整數就可以存儲所有的顏色狀態。
2.對於操作一,就是區間更新操作,需要用lazy操作,當需要更新子節點時才往下更新,把子節點的顏色染為lazy的顏色(即上一個節點染得顏色),並且把lazy下移。(代碼中的pushdown函數),更新子節點後,用pushup函數將子節點的染色狀態更新到父節點。
3.對於操作二,就是區間詢問,也用到lazy操作,需要詢問子節點時使用pushdown函數將子節點染色,然後查詢到目標區間後,返回目標區間的染色狀態(一個32位整數),最後將所查區間的染色狀態按位與,二進制中1的個數即所用顏色的數目。
易錯點:
1.注意使用lazy操作,不然超時。
2.建樹的時候也要用pushup操作更新父節點
3.在pushup函數中,是把左右子節點的染色狀態按位或,而pushdown函數中,是直接將父節點的上次所染顏色更新到子節點。原因是pushup是將子區間並起來,而pushdown是區間染色。
4.查詢的時候也要使用pushdown,因為有可能所查子節點狀態未被更新。
5.A可能大於B
代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include