思路:
通過dfs序把樹轉化為序列,把樹轉化為序列。
進出時間戳為l[i]和r[i]
修改樹上節點x 就變為 -> 修改序列上的點l[x]
查詢以樹上節點x為根的子樹節點權值和 就變為 -> l[x]-r[x] 的區間和
其他的也差不多
樹狀陣列,線段樹什麼的直接安排上。
分析:給的是樹上有向邊,且一定有乙個根節點,邊輸入完之後找入度為0的點dfs下去得到dfs序。
之後的單點查詢和區間修改操作就是基本的線段樹操作了。
code:
#include
#include
#include
#include
#include
#include
const
int inf=
0x3f3f3f3f
;const
int inn=-(
1<<30)
;using
namespace std;
const
int maxm=
5e4+5;
int a[maxm<<2]
,l[maxm]
,r[maxm]
,mark[maxm]
;vector<
int>g[maxm]
;void
pushdown
(int node)
}void
build
(int l,
int r,
int node)
void
dfs(
int x,
int&id)
r[x]
=id;
}int
ask(
int l,
int r,
int x,
int node)
void
update
(int st,
int ed,
int l,
int r,
int val,
int node)
pushdown
(node)
;int mid=
(l+r)/2
;if(st<=mid)
if(ed>=mid+1)
}int
main()
for(
int i=
1;i<=n-
1;i++
)int id=0;
for(
int i=
1;i<=n;i++)}
int m;
scanf
("%d"
,&m)
;printf
("case #%d:\n"
,cas++);
while
(m--
)else}}
return0;
}
分析:
題目已知1為根,直接從1開始dfs,跑完dfs序也就簡單了。
剩下的單點修改,區間求和,也都就只是線段樹的基本操作了。
code:
#include
#include
#include
#include
#include
#include
const
int inf=
0x3f3f3f3f
;const
int inn=-(
1<<30)
;using
namespace std;
const
int maxm=
1e5+5;
int head[maxm]
,nt[maxm]
,to[maxm]
;int cnt;
int a[maxm<<2]
,l[maxm]
,r[maxm]
;void
init
(int n)
cnt=0;
}void
add(
int x,
int y)
void
dfs(
int x,
int&id)
r[x]
=id;
}void
pushup
(int node)
void
build
(int l,
int r,
int node)
int mid=
(l+r)/2
;build
(l,mid,node*2)
;build
(mid+
1,r,node*2+
1);pushup
(node);}
intask
(int st,
int ed,
int l,
int r,
int node)
else
if(st>=mid+1)
else
}void
update
(int x,
int l,
int r,
int node)
int mid=
(l+r)/2
;if(x<=mid)
else
pushup
(node);}
intmain()
int id=0;
dfs(
1,id)
;int m;
scanf
("%d"
,&m)
;while
(m--
)else
}return0;
}
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 ...