P3258 松鼠的新家

2022-05-05 16:24:05 字數 1006 閱讀 7420

#$description$

[題面](

給你一張$n$個節點的樹和乙個遍歷的順序,必須按照順序走,求每個點被經過多少次,最後到達的點不計算次數

#$solution$

樹上差分的裸題,只需要做點差分就行了。

對於路徑上相鄰兩點做點差分會發現有的點被統計兩次,所以對於第$2-(n-1)$個經過的點標記一下,最後$dfs$的時候先讓被標記的點$ans[i]=cf[i],ans[i]--$即可,為什麼不讓$cf[i]--$?因為我們計算的$cf[i]$一定是合法的,只有中轉點因為統計兩次,所以繼續傳下去是對的,最後別忘了讓最後到達的點$ans--$,因為最後的點不計算次數

#$code$

```#include#include#include#include#define re register

#define maxn 300010

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}struct edgee[maxn<<2];

int a[maxn],x,y,fat[maxn],vis[maxn];

int cf[maxn],ans[maxn],tmp,dep[maxn],head[maxn],cnt;

int n,m,lg[maxn],num,f[maxn][23];

inline void add(int u,int v)

void pre()

void dfs(int u,int fa)

return f[x][0];

}void dfs2(int u,int fa)

ans[u]=cf[u];

if(vis[u]) ans[u]--;

}int main()

{n=read();

for(re int i=1;i<=n;++i) a[i]=read();

for(re int i=1;i

洛谷P3258松鼠的新家

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

洛谷P3258松鼠的新家

題目傳送門 恩,很明顯的乙個樹剖題,配合樹上差分其實也並不難,不過無奈蒟蒻樹剖還沒那麼熟練,而且樹上差分也做的少,所以這題愣是做了一中午。唉,果然我還是太菜了。恩,具體做法在 中解釋吧 it is made by holselee on 6th jan 2018 include include in...

P3258 JLOI2014 松鼠的新家

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