題意:給定一棵樹,某些節點上有蘋果,多次詢問各子樹上的節點數,並且在詢問的中途隨時可能新增和刪除蘋果。
分析:dfs遍歷樹的同時,對每個點標註時間,每個點有乙個開始時間和乙個結束時間,把這兩個時間當做下標,該點的蘋果個數(1或0)填入陣列的兩個對應位。子樹中結點的時間段一定是根節點時間段的子段,所以求子樹蘋果數,只需求陣列某區間的和即可。用樹狀陣列比較快。
#include#includeconst int n_max=200005;
int n,a[n_max],ne,n;
int head[n_max],cnt;
struct node
e[n_max];
struct root
p[n_max];
void addedge(int x,int y)
void bfs(int num)
pos[num]=cnt;
p[num].end=cnt++;
}void insert(int k,int p)
}int sum(int k)
return ret;
}int main()
cnt=2;
n=n+1;
bfs(1);
for(i=1;i<=n;i++)
int m,t;
char op[10];
scanf("%d",&m);
while(m--)
else
else
insert(pos[t],temp);
}} }
return 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 ...
poj 3321 樹狀陣列 dfs對映
思路 將乙個樹對映成樹狀陣列,用dfs 對圖中的蘋果樹進行遍歷 dfs遍歷順序i13 452start i 12 345end i 54 345 start 就是dfs遍歷的順序,也可以理解為dfs呼叫時入棧的時間,同理,end表示dfs呼叫結束時即退棧的時間。這樣求1號樹叉上的蘋果總數就是求從1到...