POJ3321 樹狀陣列或線段樹,對映

2021-09-14 07:33:47 字數 798 閱讀 9432

這個題並不是常規的樹狀陣列或線段樹的題,因為他本身給你的並不是乙個線性的序列,而是一棵樹。如果單純的用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 ...