description
input
output
for every inquiry, output the correspond answer per line.
sample input
31 2
1 33
q 1c 2
q 1sample output32
sourcepoj monthly–2007.08.05, huang, jinsong
題目描述:
1-n個點,根據輸入的資訊建樹
兩個操作:1,修改某個節點的數,如果是1,修改為0; 如果是0,修改為1.
2,查詢x子樹上的權值和。
演算法知識:樹狀陣列來求區間和,dfs序來處理子樹問題。
dfs序知識
樹狀陣列
dfs序兩個陣列為l陣列和r陣列,分別記錄某點進入的時間和出來的時間,中間的差值就是他的子樹的個數。
修改的時候是修改 update(l【x】,num),其實是修改s陣列的值,l【x】只是定位他是多少時間進入的。s陣列可以理解為時間從1-n的陣列。
查詢就是 getsum ( r[k] ) -getsum( l[k]-1 ) r陣列是出的時間,l陣列是入的時間,子樹的所有子節點進入和出去的時間都存在 在 l , r 陣列之間,利用字首和就能求出權值和。
第x個值的子樹權值和就是 l 陣列到 r 陣列在s陣列之前的權值和。
#include#include#include#include#includeusing namespace std;
const int maxn=1e5+10;
typedef long long ll;
ll s[maxn],sum[maxn],l[maxn],r[maxn];
ll t,tot;
vector> p(maxn);
int lowbit(int x)
void update(ll x,ll num)
}ll getsum(ll x)
return ans;
}void dfs(ll x)
r[x]=tot;
}int main()
tot=1;
dfs(1);
for(ll i=1;i<=t;i++)
ll m;
scanf("%lld",&m);
for(int i=1;i<=m;i++)
else
else
}} return 0;
}
Apple Tree(樹狀陣列 線段樹)
description 3 1 2 1 3 3 q 1 c 2 q 1 sample output 3 2 題目大意 一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。樹狀陣列版 include...
樹狀陣列 DFS序 Apple Tree
題目鏈結 output for every inquiry,output the correspond answer per line.sample input 31 2 1 33 q 1c 2 q 1sample output32 題意 就是一棵蘋果樹,二叉樹 樹有n個叉子,它們通過分支連線。卡卡...
poj 3321 Apple Tree(樹狀陣列)
輝煌北大的月賽題質量真高啊,這種樹狀陣列真難想到。樹狀陣列的基本用法是區間,單點的應用,起初這個怎麼都想不到如何套用到樹狀陣列。轉化方法是 將樹上的節點資訊查詢,轉為深度優先中節點順序 代表結點編號 進結點與出結點分別代表該結點管轄範圍。題目大意級是說,給你一顆樹,最初每個節點上都有乙個蘋果,有兩種...