Apple Tree(樹狀陣列 線段樹)

2021-07-16 13:58:23 字數 1696 閱讀 6789

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(樹狀陣列)

輝煌北大的月賽題質量真高啊,這種樹狀陣列真難想到。樹狀陣列的基本用法是區間,單點的應用,起初這個怎麼都想不到如何套用到樹狀陣列。轉化方法是 將樹上的節點資訊查詢,轉為深度優先中節點順序 代表結點編號 進結點與出結點分別代表該結點管轄範圍。題目大意級是說,給你一顆樹,最初每個節點上都有乙個蘋果,有兩種...