hdu3887dfs序 樹狀陣列 線段樹

2021-08-28 05:00:47 字數 1248 閱讀 6690

題目:

大意:求在當前點的所有後代中,後代點的序號大小《當前點的序號大小,並統計他們的個數,這就是f[i]。

思路:dfs序+樹狀陣列/線段樹

dfs序:

dfs序:dfs是深度優先的,所以對於乙個點,它會先遍歷完它的所有子節點,再去遍歷他的兄弟節點以及其他所以對於一棵樹的dfs序來說,這個點和他所有的子節點會被儲存在連續的區間之中。

怎樣統計後代序號比它小的個數之和?

首先經dfs遍歷之後每個點以及他的子節點都被儲存在乙個連續的區間內,原來的序號變成了該連續區間的下標,找比它序號小的就直接往前面找並且前面點的區間必須包含在該區間內(dfs後乙個點的子樹所在的區間一定是在該點的區間內)

已根節點7為例:dfs後in[7]=1,out[7]=15,節點為7的區間包含所有的點,所以直接在前面找,7錢面有6個點,所以f[7]=6;

節點10:in[10]=2,out[10]=5,子區間有三個,in[14]=3,out[14]=5; in[2]=4,out[2]=4;

in[13]=5,out[13]=5;但是10前面只有節點2的區間在節點10內。所以f[10]=1;

上**:

樹狀陣列:

#pragma comment(linker,"/stack:1024000000,1024000000")

#include#include#define max(a,b) a>b? a:b

#define len 100005

using namespace std;

int head[len],n,root,k,cnt,in[len],out[len];

struct node

s[len*2];

struct text

ans[len];

int c[len];

void add(int a,int b)

void dfs(int x,int pre)

out[x]=cnt;

}int lowbit(int x)

void update(int x,int p)

int sum(int x)

int main()

ans[len<<2];

void dfs(int x)

int main()

dfs(root);

build(1,n,1);

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

}return 0;

}

hdu 3887 樹狀陣列

給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...

dfs序 樹狀陣列

the first line contains an integer n n 100,000 which is the number of the forks in the tree.output for every inquiry,output the correspond answer per ...

hdu 3887 樹狀陣列(模擬棧)

一棵樹,求每個結點的子樹中有幾個數是小於這個數的 dfs會進入乙個點一次,出乙個點一次,中間經過的點都是它的子樹中的點,所以,進入的時候統計一遍,出來的時候統計一遍,兩個結果相減就可以了 純dfs會爆棧,要模擬棧。不過,不模擬棧也可以過,在網上看到c 可以設定棧的大小,所以把棧空間設定的大一點直接d...