51nod1803 森林直徑

2022-05-09 13:36:09 字數 947 閱讀 2626

題目看這裡

(為什麼xheditor不能支援字型了,不管了,那就用markdown吧)

乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中

我們需要維護兩個東西:

1.f[x][i]表示當整顆樹有[x,f[x][i]]這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的兒子,滿足條件最小的f[x][i]

2.g[k]表示最小的r,使得[l,r]組成的森林擁有長度為k的直徑

那麼每次加入一條邊(x,y) (x為y的祖先) 我們就需要更新這兩個東西:

g[i+j+1]=min(g[i+j+1],max(f[x][i],f[y][j],y-1)) (注意y-1就是這條邊的編號)

f[x][i]=min(f[x][i],max(y-1,f[y][j-1])

注意到題目的性質,樹高是log n級別的

所以一次操作是o(log n) 的,一共n次加邊,總複雜度o(n lg n)

(再也弄不回原來的code風格了,否則就是沒有高亮的了)

#pragma gcc optimize("o3")

#pragma g++ optimize("o3")

#include

#include

#include

#define m 35

#define n 500010

using

namespace

std;

struct q s[n];

int n,m,f[n][m],g[m<<2],p[n],a;

inline

bool cmp(q a,q b)

inline

void adj(int x,int y)

int main()

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

}

51nod1803 森林直徑

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

51nod 1803 森林的直徑

題目中生成樹的方式可以生成任何一種形狀的 n 節點樹。這是因為樹也是da g圖.任何形狀的樹,都可以拓撲排序後重新標號。我們計算這種方式生成的樹的期望深度。其實就是隨機生成一棵樹的期望深度。但是平均不代表不能代表特殊。更具體來說,對於 n 個節點的隨機樹。最大深度超過 h時候大概率是多少?是否有絕對...

51Nod1367 完美森林 貪心

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