P3258 JLOI2014 松鼠的新家

2022-05-19 18:43:11 字數 1053 閱讀 8867

傳送門

此題樹剖可過

然而可以樹上差分為什麼要樹剖..

對於一條路徑(a,b),只要把 val [ a ] ++ , val [ b ] ++ , val [ lca(a,b) ] -- , val [ fa[lca(a,b)] ] --

那麼求每個點的經過次數就求一下子樹 val 的和就好了

但是要注意,每一條路徑的終點是下一條路徑的起點,那些點會被多算一次

所以求完子樹和以後要再把那些點 val--

**很簡單

#include#include

#include

#include

#include

using

namespace

std;

const

int n=6e5+7

;inline

intread()

while(ch>='

0'&&ch<='

9')

return x*f;

}int fir[n],from[n<<1],to[n<<1

],cnt;

inline

void add(int &a,int &b)

intn;

int dep[n],f[n][27];//

lca的陣列

void dfs1(int x,int fa)//

dfs1預處理f和dep

}inline

int lca(int x,int y)//

求lca

inta[n],sum[n];

void dfs2(int x)//

dfs2求子樹和

}int

main()

dfs2(1);

for(int i=2;i<=n;i++) sum[a[i]]--;//

減去重複算的

for(int i=1;i<=n;i++)

printf(

"%d\n

",sum[i]);

return0;

}

P3258 JLOI2014 松鼠的新家

松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請 前來參觀,並且還指定乙份參觀指南,他希望 能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是這樣會導...

洛谷P3258 JLOI 2014松鼠的新家

題目 樹上差分 樹上點差分,注意會出現路徑端點多記錄的情況,這時需要在最後輸出的時候輸出子樹的差分陣列的和 1,而不是在處理原資料的時候減1。並且a n 不需要糖果,最後也減去就行。include define n 1001011 using namespace std struct edg e n...

洛谷P3258 JLOI2014 松鼠的新家

松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請 前來參觀,並且還指定乙份參觀指南,他希望 能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是這樣會導...