線段樹與樹狀陣列 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 如果第二次要求他交換,則他的不...