一棵樹的構造過程為:首先以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 ...