我們知道一棵有根樹可以進行深度優先遍歷(dfs)以及廣度優先遍歷(bfs)來生成這棵樹的dfs序以及bfs序。兩棵不同的樹的dfs序有可能相同,並且它們的bfs序也有可能相同,例如下面兩棵樹的dfs序都是1 2 4 5 3,bfs序都是1 2 3 4 5
現給定乙個dfs序和bfs序,我們想要知道,符合條件的有根樹中,樹的高度的平均值。即,假如共有k棵不同的有根樹具有這組dfs序和bfs序,且他們的高度分別是h1,h2,...,hk,那麼請你輸出
(h1+h2..+hk)/k
有3行。
第一行包含1個正整數n,表示樹的節點個數。
第二行包含n個正整數,是乙個1~n的排列,表示樹的dfs序。
第三行包含n個正整數,是乙個1~n的排列,表示樹的bfs序。
輸入保證至少存在一棵樹符合給定的兩個序列。
僅包含1個實數,四捨五入保留恰好三位小數,表示樹高的平均值。 5
1 2 4 5 3
1 2 3 4 5
3.500
【評分方式】
如果輸出檔案的答案與標準輸出的差不超過0.001,則將獲得該測試點上的分數,否則不得分。
【資料規模和約定】
20%的測試資料,滿足:n≤10;
40%的測試資料,滿足:n≤100;
85%的測試資料,滿足:n≤2000;
100%的測試資料,滿足:2≤n≤200000。
【說明】
樹的高度:一棵有根樹如果只包含乙個根節點,那麼它的高度為1。否則,它的高度為根節點的所有子樹的高度的最大值加1。
對於樹中任意的三個節點a , b , c ,如果a, b都是c的兒子,則a, b在bfs序中和dfs序中的相對前後位置是一致的,即要麼a都在b的前方,要麼a都在b的後方。
題解
考慮到 bf
s 序的性質,bf
s 在前的點的深度一定小於等於後面的點。所以我們考慮根據 bf
s 序計算答案。
首先根據 bf
s 序給樹上的點重編號,按 bf
s 序的先後編成 1,
2,. 然後根據bfs寫出對應dfs的值(很常用)。考慮相鄰的點
i 對答案的貢獻,如果它和 i−
1 必須在不同的層,那麼對答案的貢獻為
1 ,如果它和 i−
1 必須在同一層,那麼對答案的貢獻為
0 ,否則為
0.5 ,最後只需要把所有的貢獻加起來就行了 (1,
2號點的
貢獻應該
強制為1
)。 必須不在同一層很好判斷,考慮一下必須在同一層的情況,如果點i在 df
s 序中的位置在點 i−
1 前面的話,那麼就一定在不同層。
否則只剩下在必須在同一層或者都可以。
在同一層和不同層都可以的情況,顯然需要滿足 df
s 序中 i−
1,i 兩個點必須是連續的。我們畫圖發現,如果在一棵按 bf
s 序編號的樹中,點
i 可以變作 i−
1 的兒子的並且不改變 df
s,bf
s 序的話,只能是
i 變換後,
i 所在的那一層只有
i 乙個點並且 i,
i−1 應該有共同的父親,那麼這個條件等價於 1∼
i−1 號點在 df
s 序中 1∼
l 的一段和 r∼
n 的一段,也就是說在 df
s 序中必須是前面一段最後一段。然後其他情況就是必須在同一層了。
#include#include#include#includeusing namespace std;
const int maxn=200100;
int bfs[maxn],dfs[maxn],in[maxn],hash1[maxn];
int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
in[dfs[i]]=i;
hash1[1]=1;hash1[2]=1;
int l=2,r=n+1;
double ans=2;
for(int i=3;i<=n;i++){
if(in[i]
BZOJ3244 NOI2013樹的計數
給定一棵 n n 200000 個節點的樹的 df s bf s 序,求所有滿足要求的樹的平均深度。考慮到 bf s 序的性質,bf s 在前的點的深度一定小於等於後面的點。所以我們考慮根據 bf s 序計算答案。首先根據 bf s 序給樹上的點重編號,按 bf s 序的先後編成 1,2,n 考慮相...
BZOJ3244 Noi2013 樹的計數
這題其實我還不是很懂為什麼滿足了這兩個性質就一定合法qaq 先將所有點按其bfs序重新標號 我們令dfn i 表示i的dfs序,bfn i 表示dfs序為i的點的bfs序 考慮怎麼計算答案,我們令dep i 表示點i所在樹中的層數,那麼對dep i 做個差分,a i a i a i 1 a 1 a ...
bzoj3244 Noi2013 樹的計數
我們知道一棵有根樹可以進行深度優先遍歷 dfs 以及廣度優先遍歷 bfs 來生成這棵樹的dfs序以及bfs序。兩棵不同的樹的dfs序有可能相同,並且它們的bfs序也有可能相同,例如下面兩棵樹的dfs序都是1 2 4 5 3,bfs序都是1 2 3 4 5 現給定乙個dfs序和bfs序,我們想要知道,...