dfs序 線段樹

2022-06-08 23:21:26 字數 3014 閱讀 3245

傳送門

現有一棵樹,有以下操作:

1. 節點x及其所有子孫顏色都變更為k。

2. 要求你回答節點x的顏色。

初始所有點都沒有染色。

input

第一行乙個整數t(t <= 10),表示樣例組數。

對於每個測試樣例:

第一行乙個整數n(n <= 5e4),表示樹的節點個數。

接下來n行,每行兩個整數u, v(1 <= u, v <= n),表示樹中u的父節點是v。

接下來一行乙個整數q(q <= 5e4),表示詢問數。

接下來q行:

若為染色操作則輸入「t x k」,若為查詢操作則輸入「c x」,(1 <= x <= n, 0 <= y <= 1e9)。

output

每個測試樣例首先輸出一行"case #x:",其中x為當前樣例編號。

對於每個詢問操作輸出乙個整數,表示當前節點的顏色,若還未染色則輸出-1。

sample input

1 

5 4 3

3 2

1 3

5 2

5 c 3

t 2 1

c 3

t 3 2

c 3

sample output

case #1:

-1 1

2在做這個題之前要先知道什麼是dfs序

在網上盜了個圖

在dfs序的兩個陣列s和e,就是s[p]是p這個節點的孩子的開始e[p]是p這個節點的孩子的結束

s[p]--e[p]就是所有孩子(包括自子)的所有下標(注意他的下標是被重新定義的)

要先找到他的入口就是入度為0的點

**實現就是用dfs

void dfs(int

u) e[u]=index;

}

dfs序

參考部落格

把這個題dfs序求出來之後就是線段樹的區間修改,單點查詢了

在這個題中樣例中dfs序為

注意這個下標被重構了

注意如果是這樣的話」

void dfs(int

u)

out[u]=++idx;

}

他的結果是這樣的:

HDU snacks (線段樹 dfs序)

problem description input 輸入資料第一行是乙個整數,表示有組測試資料。對於每組資料,包含兩個整數,表示有個零食機,次操作。接下來行,每行兩個整數和,表示編號為的零食機與編號為的零食機相連。接下來一行由個數組成,表示從編號為0到編號為的零食機的初始價值。接下來行,有兩種操作 ...

求和(dfs序 線段樹)

題意 已知有n個節點,有n 1條邊,形成乙個樹的結構。給定乙個根節點k,每個節點都有乙個權值,節點i的權值為vi 給m個操作,操作有兩種型別 1 a x 表示將節點a的權值加上x 2 a 表示求a節點的子樹上所有節點的和 包括a節點本身 題解 dfs序 線段樹 用dfs序確定in x 和out x ...

3252 攻略 dfs序 線段樹

首先維護乙個根到底路徑的字首和,選某個點代表選了此點到根的路徑。那麼每次選擇了乙個點 x 這個點所在子樹內的每個點都要減少vx 的收益,那麼對於子樹的區間減可以用df s i nf,代表不可再次選到。由於每個點只會被刪除一次,而刪除一次的複雜度為o logn 所以總的複雜度為o nlog n inc...