這個題並不是常規的樹狀陣列或線段樹的題,因為他本身給你的並不是乙個線性的序列,而是一棵樹。如果單純的用dfs不斷遍歷更新,n=100000時間上受不了,又得考慮樹狀陣列或線段樹來做這種題。
思路是,對每個樹上的點,標記乙個dfs時間戳,lef[index]表示dfs從點index開始的時間戳,而rig[index]表示dfs結束,也就是返回到點index的時間戳,那麼,就可以單單用lef[index]表示index,也就是說,我們重新建立乙個線性的序列,其中每個元素i對應的就是lef[index],是不是就是線性的了!
**:
#include #include #include #include #include #include using namespace std;
const int maxn=100000+20;
int s[maxn];
int c[maxn];
int lef[maxn],rig[maxn];
vector>g(maxn);
int tot;
int n,m;
void init()
return ret;
}void dfs(int u)
rig[u]=tot;
}int main()
dfs(1);
for(int i=1;i<=n;i++)
scanf("%d",&m);
for(int i=1;i<=m;i++)
else}}
return 0;
}
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 ...