bzoj 3631 (樹上差分)

2022-07-13 10:03:09 字數 1311 閱讀 5369

給你一棵有n

n個結點的樹,現在給你乙個大小為n

n的排列,說明你的行走路徑。你每經過樹上的每乙個點,你就需要將這個點的點權加1。問你最後所有點的點權大小。

根據題目的意思,很明顯這道題是乙個非常典型的點差分的問題。我們只需要對結點uiu

i​,vi

vi​以及lca

(ui,

vi)l

ca(u

i​,v

i​),f

a[lc

a(ui

,vi)

]fa[

lca(

ui​,

vi​)

]進行差分之後即可。

最後我們還需要注意的是,上述的差分過程中,會對那些既屬於起點,又屬於終點的點會被重複經過一次。因此我們只需要在最後把他們−1−

1即可。

#include

using

namespace std;

const

int maxn=

600005

;const

int log=20;

struct nodeq[maxn<<1]

;int head[maxn]

,cnt=0;

void

add_edge

(int from,

int to)

struct lca

}void

init

(int root,

int n)}}

void

swim

(int

&x,int h)

}int

query

(int x,

int y)

}return anc[x][0

];}}lca;

int bit[maxn]

;int a[maxn]

;void

search

(int x,

int fa)

}int

main()

for(

int i=

1;i) lca.

init(1

,n);

for(

int i=

2;i<=n;i++

)search(1

,-1)

;for

(int i=

2;i<=n;i++

)for

(int i=

1;i<=n;i++

)return0;

}

BZOJ3631 松鼠的新家 樹上差分 點差分

n n 3e5 個點的一棵樹,給出a1到an,從a1走到a2,再從a2走到a3,從a3走到a4,從an 1走到an 要求,走的路徑上每走乙個點放乙個糖果,最後an不放,問每個點放了多少糖果 裸的樹上點差分,a1走到a2,就把這一條路徑 1即可 由於後續又把a2走到a3的路徑 1,故需要對a2單點減一...

bzoj3631 松鼠的新家

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

bzoj 4390(樹上差分)

給你一顆有n n個結點的樹以及m m個路徑。對於每乙個路徑pat hipa thi 代表著你將會從uiu i 走到vivi 現在問你,你走完著m m個路徑後,在這n n個結點中經過的最多的次數。首先,如果我們用dfs dfs在樹上暴力去跑的話,顯然時間肯定是接受不了的。因此我們需要考慮一種較為優美的...