hdu3974與poj3321 DFS序建線段樹

2021-09-25 21:50:07 字數 2933 閱讀 6336

思路:

通過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 ...