題解 樹上路徑

2021-08-21 21:19:40 字數 899 閱讀 1841

一棵樹的構造過程為:首先以1號點為根,然後依次加入2~n號點。

加入i號點時,在1~i-1點中選擇乙個點為f[i],將i號點與其相連線。

yuri想要求出,每次加點之後路上的最長路徑長度。

第一行乙個整數n,表示樹的節點個數。

第二行n-1個整數,第i個整數表示f[i+1]。

一行n-1個整數,分別表示加完2~n號點後,樹上最長路徑的長度。

61 2 2 1 5

1 2 2 3 4

對於前10%的資料,n<=200.

對於前40%的資料,n<=2000.

對於100%的資料,n<=200000

經過實驗,一定會有則個結論:

若現在樹上最遠兩點是a,b(即樹的直徑的兩端)

那麼新加入c點後,新的直徑只有可能在ab,ac,bc中產生;

所以每加一次點就比較三個距離,更新最大值.

#include

#include

#include

#include

using

namespace

std;

int f[200010][18],d[200010],n;

inline

void link(int p,int x)

inline

void swim(int& x,int d)

inline

int glca(int x,int y)

}int main()

p=glca(y,t);

if(d[y]+d[t]-2*d[p]>r)

printf("%d ",r);

}}

類似的還有一道題jzoj3555

5055 樹上路徑

給定一顆 n 個結點的無根樹,每個點有乙個點權,定義一條路徑的價值為路徑上的點權和 路徑的點權最大值。給定引數 p,求有多少不同的樹上簡單路徑,滿足它的價值恰好是 p 的倍數。data constraint n 105,p 107 考慮點分治。對於當前的分治重心,把所有以它為起點的路徑取出來,按照路...

樹上路徑(path)

在 berland,有n 個城堡。每個城堡恰好屬於乙個領主。不同的城堡屬於不同的領主。在所有領主中有乙個是國王,其他的每個領主都直接隸屬於另一位領主,並且間接隸屬於國王。一位領主可以擁有任意數量的下屬。這些城堡被一些雙向的道路連線。兩個城堡是連線的當且僅當他們的主人中一位直接隸屬於另一位。每一年,在...

JZOJ5055 樹上路徑

給定一棵 n 個節點的無根樹,每個點都有乙個非負整數的權值va li,定義一條路徑的價值為路徑上的點權和減去路徑的點權最大值。給定引數 p 請求出樹上有多少條價值是 p的倍數的路徑。注意 單點也算路徑。並且路徑 u v 和 v u 只算一次。1 n 105 1 p 107,0 va li 10 9 ...