hdu 3887 樹狀陣列

2021-06-08 17:17:34 字數 1255 閱讀 2643

給你一棵樹,每個節點都有個編號。

讓你求乙個節點他的子樹中編號比他小的節點有幾個。(編號唯一,從1-n,已給出根節點)

解:樹狀陣列統計。轉化為線性序列。

可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,插乙個,查詢乙個即可。

完全是自己想的,**也是自己寫的,感覺自己的能力真的在一步一步增強。還自己手寫了乙個dfs。。。到底stack overflow是不是dfs太深的緣故啊。好像是。因為我手寫了乙個棧就過了。

/*

pro: 0

sol:

date:

*/#include #include #include #include #include #include #include #include #include #define maxn 111111

using namespace std;

//linr ????

int n,p,head[maxn],esub,a,b,li,l[maxn],r[maxn],ans[maxn],c[maxn];

struct edgeedge[maxn << 1];

void add(int u, int v)

void dfs(int rt)

}if(flag)

}}//void dfs(int rt)

// r[rt] = li;

//}void modify(int pos, int val)

}int getsum(int pos)return sum;

}bool cmpx(int a,int b)

int main()

memset(head,-1 ,sizeof(head));

memset(c,0,sizeof(c));

memset(l,0,sizeof(l));

esub = li = 0;

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

dfs(p);

//很容易想到的是先插小的,並且是離線處理。

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

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

printf("%d ",ans[ii]);

printf("%d\n",ans[n]);

}return 0;

}

hdu 3887 樹狀陣列(模擬棧)

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

hdu3887dfs序 樹狀陣列 線段樹

題目 大意 求在當前點的所有後代中,後代點的序號大小 當前點的序號大小,並統計他們的個數,這就是f i 思路 dfs序 樹狀陣列 線段樹 dfs序 dfs序 dfs是深度優先的,所以對於乙個點,它會先遍歷完它的所有子節點,再去遍歷他的兄弟節點以及其他所以對於一棵樹的dfs序來說,這個點和他所有的子節...

hdu 3333 樹狀陣列

此題與3743相仿,但本題資料較大,需要用到離散化。如何去掉重複元素呢?採用離線演算法 首先將詢問按右端點從小到大排序,離線處理時,記錄每個元素所在位置,遇到重複元素時,從它之前出現的位置減去這個元素,這樣就是的每個元素總是出現在最後。include include include include ...