poj 3321 樹狀陣列 dfs對映

2021-09-30 12:06:19 字數 906 閱讀 5529

思路:將乙個樹對映成樹狀陣列,用dfs 對圖中的蘋果樹進行遍歷

dfs遍歷順序i13

452start[i]12

345end[i]54

345 start 就是dfs遍歷的順序,也可以理解為dfs呼叫時入棧的時間,同理,end表示dfs呼叫結束時即退棧的時間。

這樣求1號樹叉上的蘋果總數就是求從1到5(start[1]=1,start[2]=3,start[3]=4,start[4]=5,start[5]=2)號樹叉上的蘋果數量,同理3號樹叉上的蘋果總數就是從2到4號(start[2]=3,start[3]=4,start[4]=5)樹叉上的蘋果數量

#includeusing namespace std;

const int num=100005;

int c[num],n,m,st[num],ed[num],ord=0,head[num],e,vis[num],p[num];

//p記錄i的樹叉上是否有蘋果,初始為有;ord記錄遍歷順序,可理解為時間

struct node

edge[num*2];//鄰接表

void init()

e=0;

}void add(int a,int b)

int lowbit (int a)

void updata(int a,int add)

}int sum(int a)

return ans;

}void dfs(int a)

ed[a]=ord;

}int main()

{ int i,a,b;

char s[3];

//freopen("in.txt","r",stdin);

scanf("%d",&n);

init();

for(i=1;i

POJ 3321 樹狀陣列

題意 給定一棵樹,某些節點上有蘋果,多次詢問各子樹上的節點數,並且在詢問的中途隨時可能新增和刪除蘋果。分析 dfs遍歷樹的同時,對每個點標註時間,每個點有乙個開始時間和乙個結束時間,把這兩個時間當做下標,該點的蘋果個數 1或0 填入陣列的兩個對應位。子樹中結點的時間段一定是根節點時間段的子段,所以求...

poj 3321 樹狀陣列

首先對數進行dfs一下,前序優先遍歷,這樣做的目的是令節點i的子節點的編號組成的集合是一段連續的數,這樣在查詢的時候就能夠用樹狀陣列來查詢連續的區間的和 ac 如下 include include include include using namespace std const int max n...

poj3321 樹狀陣列 Apple Tree

description input output for every inquiry,output the correspond answer per line.sample input 3 1 21 3 3q 1 c 2q 1 sample output3 2source poj monthly ...