線段樹與樹狀陣列 H題

2021-10-08 07:39:35 字數 1307 閱讀 3551

線段樹與樹狀陣列 h題

output

for every inquiry, output the correspond answer per line.

sample input

31 2

1 33

q 1c 2

q 1sample output32

題意:一棵樹有n個結點,編號1~n,1是根節點,有n-1條邊,能執行兩種操作:①「c x」 對x結點,如果是空結點加上乙個蘋果(+1),非空節點拿掉乙個蘋果(-1)②「q x」 查詢x結點的子樹有多少蘋果,輸出。

思路:所以需要我們自己來重新給結點編號。這裡利用dfs對樹遍歷一遍,使用乙個時間戳(從1開始),在遍歷乙個結點開始和結束分別記錄時間戳s[i],e[i],能夠發現s[i]即為結點i的新編號,s[i]~e[i]即為結點i的管轄範圍(就是以i為根的子數的所有結點編號所在區間)。

然後就可以利用樹狀陣列來解決剩下的問題了,對單點進行修改,對乙個結點的子樹進行查詢,結果就是query(e[i])-query(s[i]-1)。

#include

using

namespace std;

const

int maxn=

100005

;struct nodeedge[maxn<<1]

;int head[maxn]

,tr[maxn]

,s[maxn]

,e[maxn]

;bool vis[maxn]

,a[maxn]

;int n,m,cnt,tim;

void

add(

int u,

int v)

void

dfs(

int p)

e[p]

=tim;

}int

lowbit

(int x)

void

update

(int x,

int num)

}int

query

(int x)

return ans;

}int

main()

for(

int i=

1;i++i)

dfs(1)

;scanf

("%d"

,&m)

;char c;

int t;

while

(m--

)else

}else

}return0;

}

樹狀陣列與線段樹

推一下關於樹狀陣列的講解部落格 和線段樹的講解 package test2 public class 線段樹 int len a.length segtree t buildtree 0,len 1,a int sum0 2 query t,0,2 int sum1 3 query t,1,3 查詢...

樹狀陣列與線段樹(三)

找規律題 1.螺旋折線 如下圖所示的螺旋折線經過平面上所有整點恰好一次。對於整點 x,y 我們定義它到原點的距離 dis x,y 是從原點到 x,y 的螺旋折線段的長度。例如 dis 0,1 3,dis 2,1 9 給出整點座標 x,y 你能計算出 dis x,y 嗎?輸入格式 包含兩個整數 x,y...

樹狀陣列與線段樹(二)

樹狀陣列 1.小朋友排隊 n n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是 0 0 如果某個小朋友第一次被要求交換,則他的不高興程度增加 1 1 如果第二次要求他交換,則他的不...