線段樹模板加部分內容詳解

2021-08-21 14:30:53 字數 1347 閱讀 2390

void build(int l,int r,int now)

int m = (l+r)>>1;

build(l,m,now<<1);//建立左子樹

build(m+1,r,now<<1|1);//建立右子樹

sum[now] = sum[now<<1]+sum[now<<1|1];//父結點是左右子樹的和

}

void update(int l,int r,int i,int num,int now)//num是點需要加的值

int m = (l+r)>>1;

if(i <= m)

update(l,m,i,num,now<<1);

else

update(m+1,r,i,num,now<<1|1);

sum[now] = sum[now<<1] + sum[now<<1|1];//依此修改因為點變化而導致的區間變化

}

void update2(int l,int r,int l,int r,int num,int now)

int m = (l+r)>>1;

pushdown(m-l+1,r-m,now);//區間修改只修改了相應區間,卻沒有修改子區間,所以需要這個來修改子區間

if(l <= m) update2(l,r,l,m,num,now<<1);

if(r > m) update2(l,r,m+1,r,num,now<<1|1);

sum[now] = sum[now<<1] + sum[now<<1|1];

}

void pushdown(int ln,int rn,int now)

}

線段樹比較簡單,網上的其他部落格都寫得很詳細,唯一的難點可能就是pushdown,也就是向下推子區間,這個其他部落格很少講,我來解釋下。

首先pushdown是用到了區間修改才需要的,通過觀察區間修改,我們發現它只修改了區間,而沒有修改子區間,舉個例子:

圖可以在上面找,有區間[1,10],每個值都是1,,我們要修改區間[1,5],讓該區間的每個值加1,那麼,用區間修改update2函式就可以修改區間[1,5]了,然後修改結束。那麼,子區間[1,2],[3,5]呢?沒有修改!所以我們把[1,5]區間位置標記一下,add[位置]加1。

然後我們呼叫pushdown函式,由於此時[1,5]被標記了,所以先向下標記子區間,再修改子區間的值。通過這個,我們可以修改[1,2],[3,5]區間的值,然後再將來這兩個區間位置標記下,以便將來查詢到這兩個區間時,再修改[1.2]的子區間[1,1],[2,2]和[3,5]的子區間[3,4]和[5,5]。

CSS部分內容

一.css部分內容 引入 1 行間樣式 關鍵字style 2 內嵌樣式 關鍵字style 3 外聯樣式 關鍵字 link 選擇器 id選擇器 class選擇器 後代選擇器 父元素 子元素 子代選擇器 父元素 子元素 多種 組合選擇器 元素1,元素2,偽類選擇器 元素 hover 滑鼠移動到元素上時的...

jsp 遺漏部分內容

1.web inf 目錄的檔案外界不能直接訪問,因此可以通過把一些後台的jsp檔案放在web inf 資料夾中以提高安全性.同時可以通過程式配置去訪問這些頁面,在 web.xml中作出一定的配置即可.頁面部分 可以通過 config 內建物件獲取配置在 web.xml中的值 string user ...

mysql 替換字段部分內容

mysql replace的用法 替換某欄位部分內容 mysql replace的用法 1.replace into replace into table id,name values 1 aa 2 bb 此語句的作用是向表table中插入兩條記錄。如果主鍵id為1或2不存在就相當於 insert ...