output
for every inquiry, output the correspond answer per line.
sample input
3 1 2
1 3
3 q 1
c 2
q 1
sample output 3 2
樹狀陣列的中級應用,求一段子樹,都覺得和樹狀陣列沾不上邊,
但是嘛,有數就有子樹有順序,有順序就可以用線段數和樹狀陣列了,今天看乙個人說的很好,基本上線段樹能做到的樹狀陣列也能做到,但是一些最大最小值的還是線段樹比較好。
這道題是求一段一段子樹的和,所以應該有那麼乙個陣列訪問的是每一顆子樹(子樹就相當於樹狀陣列裡面的結點)的和,然後需要兩個陣列訪問的是每棵子樹的左右邊界也就是每個結點的左右邊界,那麼就可以用用樹狀陣列了,還有用乙個陣列表示樹狀陣列,那麼怎麼得到每個結點的左右邊界呢,用深搜,用vector很完美。
建立乙個二維vector
#include
#include
#include
#include
#include
#define mem(a) memset(a,0,sizeof(a));
#define lowbit(x) ((x)&(-x))
using
namespace
std;
typedef
vector
vd; //很方便
const
int maxn=500010;
vector
edge(maxn); //建立乙個二維vector
int right[maxn],left[maxn]; //每個子樹的邊界
int treearray[maxn]; //樹狀陣列
int fork[maxn]; //表示當前樹有沒有蘋果。
int key;
int n;
void init()
right[node]=key; //右邊界
}void update(int x,int val)
return sum;
}void readdataanddo()
key=1; dfs(1); //用1開始深搜
int m;
scanf("%d%*c",&m);
char ch;
int d;
for(int i=1;i<=n;i++)
for(int i=0;iscanf(" %c%d%*c",&ch,&d);
if(ch=='q')
else
}}int main()
}
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 ...