51nod 1803 森林的直徑

2021-08-11 15:11:56 字數 1415 閱讀 1910

題目中生成樹的方式可以生成任何一種形狀的

n 節點樹。

這是因為樹也是da

g圖.任何形狀的樹,都可以拓撲排序後重新標號。

我們計算這種方式生成的樹的期望深度。其實就是隨機生成一棵樹的期望深度。

但是平均不代表不能代表特殊。

更具體來說,對於

n 個節點的隨機樹。最大深度超過

h時候大概率是多少?(是否有絕對的概率優勢)。

這裡只能給出平均意義下的樹的深度。出現教壞情況的概率應該不會很大。

首先。第

n 個結點可能深度是多少呢?

演算法可以看作我們從節點

n開始.每次隨機的選擇乙個之前的節點。去跳躍。每次跳躍距離都不超過到達節點

1 的距離的一半概率近似為o(

12)

連續k次跳躍。出現這種情況的概率顯然隨著

k的增加收斂很快。o(

(12)

k)。但這個分析很不嚴謹。能力有限。不能給出準確的概率分布。

但可以看出。出現壞的情況的概率不會很大。

那麼平均意義下的結論還是值得使用的。

定義。節點

n 的平均深度為 f(

n)下面是ac**:

#include 

#include

#include

#include

#define maxn 500005

#define child 1000

using

namespace

std;

const

int inf=0x3f3f3f3f;

struct io

void io_fread()

void read(int &tmp)

while(*l<'0'||*l>'9')

}while(*l>='0'&&*l<='9')}}

}i;struct prob

; bool

operator

<(const prob&a)const

}q[maxn];

int len[maxn][61];

int ph[maxn];

int dp[child];

int main ()

sort(q,q+q);

memset(len,0x3f,sizeof len);

memset(dp,0x3f,sizeof dp);

for(int d=n;d;d--)

for(int k=0;len[d][k]if(len[p][k+1]>len[d][k])

len[p][k+1]=len[d][k];

while(c=d)

}printf("%d\n",ans);

return

0;}

51nod1803 森林直徑

題目看這裡 為什麼xheditor不能支援字型了,不管了,那就用markdown吧 乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中 我們需要維護兩個東西 1.f x i 表示當整顆樹有 x,f x i 這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的...

51nod1803 森林直徑

題目看這裡 為什麼xheditor不能支援字型了,不管了,那就用markdown吧 乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中 我們需要維護兩個東西 1.f x i 表示當整顆樹有 x,f x i 這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的...

51Nod1367 完美森林 貪心

有一棵n個點的樹,樹中節點標號依次為0,1,2,n 1,其中n 500000。樹中有n 1條邊,這些邊長度不一定相同。現在要把樹中一些邊刪除,設刪除了k條邊 k 0,即可以不刪除任何邊 由樹的性質可知,該樹將被分割為乙個含有k 1棵樹的森林。稱乙個森林是 完美森林 要求這個森林中的每一棵樹滿足 該樹...