POJ 3321 DFS序 樹狀陣列 查詢子樹

2021-08-28 22:03:12 字數 1310 閱讀 9834

給乙個樹,查詢結點下的子樹的蘋果總數,並且要求支援增減蘋果

查詢子樹,我們首先想到的是dfs序,還要支援修改操作,我們可以用樹狀陣列維護這個dfs序,因為還要查詢,所以我在實際程式中使用了尤拉序。

#include

#include

#include

#define debug(x) cout<<#x<<" = "<#define inf 0x3f3f3f3f

using

namespace std;

const

int maxn =

100010

;vectorint>

>

g(maxn)

;//vectorg[maxn]這麼寫會tle 雖讓我也不知道為什麼

int step, start_dfs[maxn]

, end_dfs[maxn]

, f[maxn]

;void

dfs(

int u)

end_dfs[u]

= step;

}/********************樹狀陣列模板************************/

int bitree_max = maxn;

//資料範圍[1,bitree],注意最小值是1,如果為0,請++

int bitree_num[maxn]

;//maxn為元素的個數

void

update

(int i,

int value)

}int

query

(int i)

return ans;

}/********************樹狀陣列模板************************/

intmain

(void

) step =1;

dfs(1)

;//dfs序

for(

int i =

1; i <= n; i++

)scanf

("%d"

,&m)

;char op;

int key;

for(

int i =

1; i <= m; i++

)else

cout <<

query

(end_dfs[key])-

query

(start_dfs[key]-1

)<< endl;

}return0;

}

poj 3321(dfs序 樹狀陣列)

第一次知道dfs序這個東西,可以維護樹上的任意乙個節點,以這個節點為根的子樹上的所有節點的標號。是連續的一段區間。一棵子樹的所有節點在dfs序裡是連續一段,主要就是利用這個性質來解題 然後就是樹狀陣列維護區間內蘋果的數量 另外這個題很卡時間,我用了輸入輸出掛才過 include includeusi...

POJ 3321 dfs 樹狀陣列

1.題目鏈結。題目大意 一棵樹上的每乙個節點在初始的時候都長了乙個蘋果,然後有這樣的兩種操作 1 q x 詢問以x為根節點的子樹上蘋果的數量 2 c x把標號為x除的狀態改變。狀態改變的意思就是原來這裡有蘋果,就變沒,原來沒有就長出來乙個,保證每個節點最多乙個蘋果。2.首先我們肯定沒有辦法離線所有的...

POJ 3321 DFS序 線段樹

思路 先dfs一遍 對於每乙個點 找到begin 和end dfs進的時候的cnt 和出的時候的cnt 每回修改的時候 改begin上邊的權值 查的時候查 begin,end 呃 如果我說得不清楚 請看 by siriusren include include include using names...