線段樹複習 POJ3667

建樹

void  build(int p,int l,int r)void\ \ build(int\ p,int\ l,int\ r)

  1. 當前節點賦值
  2. 判斷是否到葉子節點,葉子節點則退出,否則遞歸到子節點
查詢

int  query(int p,int l,int r,int len)int\ \ query(int\ p,int\ l,int\ r,int\ len)

  • 判斷是否爲葉子節點,是葉子節點直接返回,否則更新當前節點信息
  • 題目要求序號儘可能小。遞歸時,若左滿足條件就遞歸左兒子;然後嘗試中間的;最後嘗試只有右兒子
更新

void  updata(int L,int R,int p,int l,int r,int c)void\ \ updata(int\ L,int \ R,int\ p,int\ l,int\ r,int\ c)

  • 當前節點區間是更新區間的子集,更新當前區間並對當前節點懶惰標記tag,結束更新
  • 獨立判斷需要更新的子節點區間,含有修改範圍內的子節點均需更新
  • 利用上一步得到的子節點信息更新獲得新的當前節點信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章