E Apple Tree DFS序,樹狀陣列

2021-09-18 07:04:36 字數 1333 閱讀 6117

poj - 3321

題意:​ 一顆蘋果樹,剛開始所有節點都有蘋果,有以下兩種操作,一種是改變乙個節點的狀態(有蘋果就取走,沒蘋果就產生乙個),一種是詢問乙個點的子樹(包括節點自己)一共有多少個蘋果,對於每次詢問輸出結果

分析:

重新dfs序給節點標號,那麼沒個節點的子孫就對應乙個連續的區間。那麼修改點的狀態相當於單點修改,查詢操作相當於區間求和,樹狀陣列和線段樹都可以寫。
注:poj存樹圖用vector超時

#include

#include

#include

#include

#include

#define mset(a,b) memset(a,b,sizeof(a))

using

namespace std;

typedef

long

long ll;

const ll maxn=

1e5+20;

const ll max=

100000

;ll ds[maxn]

,l[maxn]

,r[maxn]

;//頂點u對應的區間為[l,r],u的虛擬節點為ds[u]

ll book[maxn]

,tot,ecnt;

ll bt[maxn]

,sw[maxn]

;int head[maxn]

;struct edgeedge[maxn<<1]

;void

addedge

(int u,

int v,

int ed)

void

dfs(ll u)

r[u]

=tot;}/*

重現構造搜尋序列

*/ll lowbit

(ll k)

void

modify

(ll k,ll val)

}ll getsum

(ll k)

return ans;

}char s[10]

;int

main()

tot=0;

dfs(1)

;for

(ll i=

1;i<=n;

++i)

modify

(i,1);

ll q;

scanf

("%lld"

,&q)

;while

(q--

)else

else}}

return0;

}

樹 先序中序後序遍歷

題目分析 題目描述 description 求一棵二叉樹的前序遍歷,中序遍歷和後序遍歷 輸入描述 input description 第一行乙個整數n,表示這棵樹的節點個數。接下來n行每行2個整數l和r。第i行的兩個整數li和ri代表編號為i的節點的左兒子編號和右兒子編號。輸出描述 output d...

Assign the task(dfs序 線段樹)

hdoj 3974 題意 有一家公司有n個員工 從1到n 公司裡每個員工都有乙個直接的老闆 除了整個公司的領導 如果你是某人的直接老闆,那個人就是你的下屬,他的所有下屬也都是你的下屬。如果你是沒有人的老闆,那麼你就沒有下屬,沒有直接老闆的員工就是整個公司的領導,也就是說n個員工構成了一棵樹。公司通常...

Assign the task(dfs序 線段樹)

題目傳送門 assign the task 給你一棵樹,共n個結點,每個結點具有乙個顏色,可以對結點進行染色和查詢 共n 1條邊,分n 1行分別包含兩個整數u和v,表示v是u的父節點 然後有m次操作 若為染色操作則輸入 t x k 若為查詢操作則輸入 c x 首先可以用dfs序將無根樹區間化,即可以...