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序將無根樹區間化,即可以...