傳送門input現有一棵樹,有以下操作:
1. 節點x及其所有子孫顏色都變更為k。
2. 要求你回答節點x的顏色。
初始所有點都沒有染色。
第一行乙個整數t(t <= 10),表示樣例組數。output對於每個測試樣例:
第一行乙個整數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)。
每個測試樣例首先輸出一行"case #x:",其中x為當前樣例編號。sample input對於每個詢問操作輸出乙個整數,表示當前節點的顏色,若還未染色則輸出-1。
1sample output5 4 3
3 2
1 3
5 2
5 c 3
t 2 1
c 3
t 3 2
c 3
case #1:-1 1
2在做這個題之前要先知道什麼是dfs序
在網上盜了個圖在dfs序的兩個陣列s和e,就是s[p]是p這個節點的孩子的開始e[p]是p這個節點的孩子的結束s[p]--e[p]就是所有孩子(包括自子)的所有下標(注意他的下標是被重新定義的)
要先找到他的入口就是入度為0的點
**實現就是用dfs
void dfs(intdfs序u) e[u]=index;
}
參考部落格
把這個題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...