poj 3321 樹狀陣列 第一題

2021-09-08 23:03:48 字數 932 閱讀 6902

郭老師的分析:  一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。具體做法是做一次dfs,記下每個節點的開始時間start[i]和結束時間end[i],那麼對於i節點的所有子孫的開始時間和結束時間都應位於start[i]和end[i]之間,另外用乙個陣列c[i]記錄附加在節點i上的蘋果的個數,然後用樹狀陣列統計start[i]到end[i]之間的附加蘋果總數。這裡用樹狀陣列統計區間可以用sum(start[i])-sum(end[i]-1)來計算。

第一次做樹狀陣列的題。把源**原原版版的抄下來了。。。看懂了,為了加深印象,又為了節省時間。。。好吧,期待下一題。這幾個週末要出去玩了,沒時間做題了。。。嗚嗚。。。

#include 

#include

using

dfs時的開始時間

int end[my_max]; //

dfs是的結束時間

int ncount=0;

void dfs(int v)

return nsum;

}void modify(int p,int val)

}int main()

ncount=0;

dfs(1);

//樹狀陣列要處理的原始陣列下標範圍是1--ncount

求c陣列,即樹狀陣列的節點的值

for(i=1;i<=ncount;i++)

c[i]=i-(i-lowbit[i]+1)+1;

scanf("

%d",&m);

for(i=0;ichar cmd[10];

int a;

scanf("

%s%d

",cmd,&a);

if(cmd[0]=='

c%d\n

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 ...