Apple Tree 樹狀陣列 dfs序

2021-09-25 14:48:02 字數 1274 閱讀 2909

description

input

output

for every inquiry, output the correspond answer per line.

sample input

31 2

1 33

q 1c 2

q 1sample output32

sourcepoj monthly–2007.08.05, huang, jinsong

題目描述:

1-n個點,根據輸入的資訊建樹

兩個操作:1,修改某個節點的數,如果是1,修改為0; 如果是0,修改為1.

2,查詢x子樹上的權值和。

演算法知識:樹狀陣列來求區間和,dfs序來處理子樹問題。

dfs序知識

樹狀陣列

dfs序兩個陣列為l陣列和r陣列,分別記錄某點進入的時間和出來的時間,中間的差值就是他的子樹的個數。

修改的時候是修改 update(l【x】,num),其實是修改s陣列的值,l【x】只是定位他是多少時間進入的。s陣列可以理解為時間從1-n的陣列。

查詢就是 getsum ( r[k] ) -getsum( l[k]-1 ) r陣列是出的時間,l陣列是入的時間,子樹的所有子節點進入和出去的時間都存在 在 l , r 陣列之間,利用字首和就能求出權值和。

第x個值的子樹權值和就是 l 陣列到 r 陣列在s陣列之前的權值和。

#include#include#include#include#includeusing namespace std;

const int maxn=1e5+10;

typedef long long ll;

ll s[maxn],sum[maxn],l[maxn],r[maxn];

ll t,tot;

vector> p(maxn);

int lowbit(int x)

void update(ll x,ll num)

}ll getsum(ll x)

return ans;

}void dfs(ll x)

r[x]=tot;

}int main()

tot=1;

dfs(1);

for(ll i=1;i<=t;i++)

ll m;

scanf("%lld",&m);

for(int i=1;i<=m;i++)

else

else

}} return 0;

}

Apple Tree(樹狀陣列 線段樹)

description 3 1 2 1 3 3 q 1 c 2 q 1 sample output 3 2 題目大意 一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。樹狀陣列版 include...

樹狀陣列 DFS序 Apple Tree

題目鏈結 output for every inquiry,output the correspond answer per line.sample input 31 2 1 33 q 1c 2 q 1sample output32 題意 就是一棵蘋果樹,二叉樹 樹有n個叉子,它們通過分支連線。卡卡...

poj 3321 Apple Tree(樹狀陣列)

輝煌北大的月賽題質量真高啊,這種樹狀陣列真難想到。樹狀陣列的基本用法是區間,單點的應用,起初這個怎麼都想不到如何套用到樹狀陣列。轉化方法是 將樹上的節點資訊查詢,轉為深度優先中節點順序 代表結點編號 進結點與出結點分別代表該結點管轄範圍。題目大意級是說,給你一顆樹,最初每個節點上都有乙個蘋果,有兩種...