description:
3 1 2
1 3
3 q 1
c 2
q 1
sample output:
3 2
題目大意:
一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。
樹狀陣列版:
#include
using namespace std;
const
int maxn=210100;
struct node
e[maxn];
char s;int x;
intin[maxn],out[maxn],c[maxn],cnt;
int n,m,tot,head[maxn],vis[maxn];
void edd_edge(int u,int v)
int lowbit(int x)
void dfs(int x)
void update(int x,int add)
}int sum(int x)
return s;
}int main()
dfs(1);
for(int i=1;i<=n;i++)
update(in[i],1),vis[i]=1;
cin>>m;
for(int i=1;i<=m;i++)
if(s=='q')
cout0;}
線段樹版:
#include
using namespace std;
const
int maxn=100010;
struct edge
e[maxn*2];
struct node
tree[maxn*4];
char c;
int n,m,tot,a[maxn];
int head[maxn],in[maxn],out[maxn];
void add_edge(int u,int v)
void dfs(int u)
void build_tree(int ll,int rr)
else tree[cur].sum=1;
}int find(int k,int l,int r)
void change(int k,int l,int r,int p)
int mid=(tree[k].l+tree[k].r)>>1;
if(lif(r>mid) change(tree[k].rch,l,r,p);
tree[k].sum=tree[tree[k].lch].sum+tree[tree[k].rch].sum;
}int main()
tot=0;
dfs(1);tot=0;
build_tree(1,n+1);
for(int i=1;i<=n;i++)
a[i]=1;
cin>>m;
for(int i=1;i<=m;i++)
else
cout<1,in[x],out[x]+1)0;}
樹狀陣列 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個叉子,它們通過分支連線。卡卡...
Apple Tree 樹狀陣列 dfs序
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 20...
poj 3321 Apple Tree(樹狀陣列)
輝煌北大的月賽題質量真高啊,這種樹狀陣列真難想到。樹狀陣列的基本用法是區間,單點的應用,起初這個怎麼都想不到如何套用到樹狀陣列。轉化方法是 將樹上的節點資訊查詢,轉為深度優先中節點順序 代表結點編號 進結點與出結點分別代表該結點管轄範圍。題目大意級是說,給你一顆樹,最初每個節點上都有乙個蘋果,有兩種...