給你一棵有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在樹上暴力去跑的話,顯然時間肯定是接受不了的。因此我們需要考慮一種較為優美的...