給你一棵樹,每個節點都有個編號。
讓你求乙個節點他的子樹中編號比他小的節點有幾個。(編號唯一,從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 ...