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