生活随笔
收集整理的這篇文章主要介紹了
【Cf Edu #47 F】Dominant Indices(长链剖分)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
要求每個(gè)點(diǎn)子樹中節(jié)點(diǎn)最多的層數(shù),一個(gè)通常的思路是樹上啟發(fā)式合并,對(duì)于每一個(gè)點(diǎn),保留它的重兒子的貢獻(xiàn),暴力掃輕兒子將他們的貢獻(xiàn)合并到重兒子里來(lái)。
參考重鏈剖分,由于一個(gè)點(diǎn)向上最多只有$log$條輕邊,故每個(gè)點(diǎn)最多被合并$log$次。但這不是這題想說(shuō)的。
由于我們只保留以深度為下標(biāo)的信息,重鏈剖分就會(huì)多算,以此引出長(zhǎng)鏈剖分,權(quán)且作為一個(gè)模板來(lái)學(xué)習(xí)。
長(zhǎng)鏈剖分時(shí),每個(gè)點(diǎn)以最深的兒子作為長(zhǎng)兒子,其余為短兒子。
每個(gè)點(diǎn)$O(1)$繼承長(zhǎng)兒子的信息,將短兒子的信息合并上來(lái)。每個(gè)點(diǎn)只有作為短兒子時(shí)才保留以它為鏈頭的一條長(zhǎng)鏈上的信息,空間復(fù)雜度為$O(鏈長(zhǎng))$。
顯然,每次短兒子被合并之后就不會(huì)再被訪問(wèn)到了,因?yàn)樗喜⒌搅艘粭l比它更長(zhǎng)的鏈,而所有的長(zhǎng)鏈都不相交,每條鏈都以$O(鏈長(zhǎng))$被合并掉,故總復(fù)雜度是$O(n)$的。
這道題只要維護(hù)深度為$i$的節(jié)點(diǎn)的數(shù)量,取最大值即可。
?
$\bigodot$技巧&套路:
- 以深度為下標(biāo)的信息,可以考慮長(zhǎng)鏈剖分。
- 通常信息的合并,DSU on tree就可以了。
1 #include <cstdio>
2 #include <vector>
3
4 const int N =
1000005;
5
6 int n, hig[N], res[N], son[N], dep[N];
7 std::vector<
int>
g[N];
8
9 int yun, las[N], to[N <<
1], pre[N <<
1];
10 inline
void Add(
int a,
int b) {
11 to[++yun] = b; pre[yun] = las[a]; las[a] =
yun;
12 }
13
14 void Dfs(
int x,
int Fa) {
15 for (
int i = las[x]; i; i = pre[i])
if (to[i] !=
Fa) {
16 Dfs(to[i], x);
17 if (hig[x] < hig[to[i]] +
1) {
18 hig[x] = hig[to[i]] +
1;
19 son[x] =
to[i];
20 }
21 }
22 if (!
son[x]) {
23 g[x].push_back(
1);
return;
24 }
25 std::swap(g[x], g[son[x]]);
26 res[x] =
res[son[x]];
27 for (
int i = las[x]; i; i = pre[i])
if (to[i] !=
Fa) {
28 if (son[x] !=
to[i]) {
29 int nx = (
int)g[x].size(), nt = (
int)g[to[i]].size();
30 for (
int j =
0; j < nt; ++
j) {
31 g[x][nx - nt + j] +=
g[to[i]][j];
32 if (g[x][nx - nt + j] >= g[x][res[x]]) res[x] = nx - nt +
j;
33 }
34 }
35 }
36 g[x].push_back(
1);
37 if (g[x][res[x]] ==
1) res[x] = (
int)g[x].size() -
1;
38 }
39
40 int main() {
41 scanf(
"%d", &
n);
42 for (
int i =
1, x, y; i < n; ++
i) {
43 scanf(
"%d%d", &x, &
y);
44 Add(x, y); Add(y, x);
45 }
46 Dfs(
1,
0);
47 for (
int i =
1; i <= n; ++
i) {
48 printf(
"%d\n", hig[i] -
res[i]);
49 }
50
51 return 0;
52 }
View Code ?
轉(zhuǎn)載于:https://www.cnblogs.com/Dance-Of-Faith/p/9322458.html
總結(jié)
以上是生活随笔為你收集整理的【Cf Edu #47 F】Dominant Indices(长链剖分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。