bzoj3244 Noi2013 樹的計數

2022-05-02 04:51:06 字數 2194 閱讀 3594

我們知道一棵有根樹可以進行深度優先遍歷(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的後方。

正解:結論題。

一道神奇的人類智慧型題。。

考慮把點按照$dfs$序編號,然後我們研究一下$bfs$序的一些性質。

如果$bfn_>bfn_$,那麼很顯然,$i+1$這個點一定在$i$的下一層,它對答案的貢獻為$1$;

如果$bfn_+1=bfn_$,且$i+1$到$n$能形成一段連續的$dfn$區間,那麼$i+1$這個點有兩種可能,一種是$i$的兄弟,一種是$i$的兒子,這兩種情況概率是相等的,那麼它對答案的貢獻就是$0.5$;

如果$bfn_+1然後我們就這麼做完這題了。。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#define inf (1<<30)

14#define n (500010)

15#define il inline

16#define rg register

17#define ll long long

18#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

1920

using

namespace

std;

2122

intdfn[n],bfn[n],l[n],r[n],n;

23double

ans;

2425 il int

gi()

3233 il void

work()

35for (rg int i=1;i<=n;++i) dfn[gi()]=i,ans=2;36

for (rg int i=1;i<=n;++i) bfn[i]=dfn[gi()]; l[n+1]=n+1;37

for (rg int i=n;i;--i) l[i]=min(l[i+1],bfn[i]),r[i]=max(r[i+1

],bfn[i]);

38for (rg int i=2;ii)

39if (bfn[i]>bfn[i+1]) ++ans;

40else

if (bfn[i]+1==bfn[i+1] && r[i+1]-l[i+1]+1==n-i) ans+=0.5

;41 printf("

%0.3lf\n

",ans); return;42

}4344int

main()

BZOJ3244 NOI2013樹的計數

給定一棵 n n 200000 個節點的樹的 df s bf s 序,求所有滿足要求的樹的平均深度。考慮到 bf s 序的性質,bf s 在前的點的深度一定小於等於後面的點。所以我們考慮根據 bf s 序計算答案。首先根據 bf s 序給樹上的點重編號,按 bf s 序的先後編成 1,2,n 考慮相...

BZOJ3244 NOI2013 樹的計數

我們知道一棵有根樹可以進行深度優先遍歷 dfs 以及廣度優先遍歷 bfs 來生成這棵樹的dfs序以及bfs序。兩棵不同的樹的dfs序有可能相同,並且它們的bfs序也有可能相同,例如下面兩棵樹的dfs序都是1 2 4 5 3,bfs序都是1 2 3 4 5 現給定乙個dfs序和bfs序,我們想要知道,...

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 ...