BZOJ3244 NOI2013 樹的計數

2021-08-08 01:18:55 字數 2222 閱讀 9526

我們知道一棵有根樹可以進行深度優先遍歷(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序,我們想要知道,...