POJ 3321 dfs 樹狀陣列

2021-09-17 04:23:36 字數 963 閱讀 5547

1.題目鏈結。題目大意:一棵樹上的每乙個節點在初始的時候都長了乙個蘋果,然後有這樣的兩種操作:

(1)q x:詢問以x為根節點的子樹上蘋果的數量

(2)c x把標號為x除的狀態改變。狀態改變的意思就是原來這裡有蘋果,就變沒,原來沒有就長出來乙個,保證每個節點最多乙個蘋果。

2.首先我們肯定沒有辦法離線所有的操作,然後看這種點修改,區間查詢,馬上就想到了樹狀陣列了。但是我們怎麼把樹上的資訊放在樹狀陣列上維護呢?這是乙個很重要的問題。其實這個問題並不難解決,我們可以對這棵樹做一遍dfs,dfs的過程中對節點編號,這樣每一顆子樹都一定是乙個連續的區間,區間的起點就是根節點,終點是子樹裡面編號最大的那個節點,所以在dfs回溯的過程中維護一下這個資訊,那麼我們就可以把一顆子樹對映成陣列上一段連續的區間,然後就是點修改,區間查詢的基本操作了。

#include#include#include#include#include#includeusing namespace std;

#define ll long long

#pragma warning(disable:4996)

const ll maxn = 1e5 + 5;

int n;

int trans[maxn];

vector< vector>v(maxn);

int cnt = 1;

inline int lb(int x)

void add(int x, int num)

ll getsum(int x)

void dfs(int x)

int main()

for (int i = 1; i > s >> k;

scanf(" %c %d", &s, &k);

int t = trans[k];

if (s == 'q')

else

}} return 0;

}

poj 3321(dfs序 樹狀陣列)

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

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

給乙個樹,查詢結點下的子樹的蘋果總數,並且要求支援增減蘋果 查詢子樹,我們首先想到的是dfs序,還要支援修改操作,我們可以用樹狀陣列維護這個dfs序,因為還要查詢,所以我在實際程式中使用了尤拉序。include include include define debug x cout x define...

POJ 3321 DFS序 線段樹

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