POJ 3321 DFS序 線段樹

2021-07-24 11:45:40 字數 1044 閱讀 9410

思路:

先dfs一遍 對於每乙個點 找到begin 和end(dfs進的時候的cnt 和出的時候的cnt)

每回修改的時候 改begin上邊的權值 查的時候查 [begin,end]

呃 如果我說得不清楚 請看

//by siriusren

#include

#include

#include

using namespace std;

#define n 600500

int n,xx,yy,first[n],next[n],v[n],tot,tree[n*10],begin[n],end[n],cnt,q;

char op[3];

void add(int

x,int

y)void dfs(int

x,int fa)

void build(int l,int r,int

pos)

int mid=(l+r)>>1,lson=pos

<<1,rson=pos

<<1|1;

build(l,mid,lson),build(mid+1,r,rson);

tree[pos]=tree[lson]+tree[rson];

}void insert(int l,int r,int

pos)

int mid=(l+r)>>1,lson=pos

<<1,rson=pos

<<1|1;

if(mid>=begin[xx])insert(l,mid,lson);

else insert(mid+1,r,rson);

tree[pos]=tree[lson]+tree[rson];

}int query(int l,int r,int

pos)

int main()

dfs(1,-1),build(1,cnt,1);

scanf("%d",&q);

for(int i=1;i<=q;i++)

}

POJ 3321 DFS序 線段樹

思路 先dfs一遍 對於每乙個點 找到begin 和end dfs進的時候的cnt 和出的時候的cnt 每回修改的時候 改begin上邊的權值 查的時候查 begin,end 呃 如果我說得不清楚 請看 by siriusren include include include using names...

poj 3321(dfs序 樹狀陣列)

第一次知道dfs序這個東西,可以維護樹上的任意乙個節點,以這個節點為根的子樹上的所有節點的標號。是連續的一段區間。一棵子樹的所有節點在dfs序裡是連續一段,主要就是利用這個性質來解題 然後就是樹狀陣列維護區間內蘋果的數量 另外這個題很卡時間,我用了輸入輸出掛才過 include includeusi...

POJ 3321 dfs 樹狀陣列

1.題目鏈結。題目大意 一棵樹上的每乙個節點在初始的時候都長了乙個蘋果,然後有這樣的兩種操作 1 q x 詢問以x為根節點的子樹上蘋果的數量 2 c x把標號為x除的狀態改變。狀態改變的意思就是原來這裡有蘋果,就變沒,原來沒有就長出來乙個,保證每個節點最多乙個蘋果。2.首先我們肯定沒有辦法離線所有的...