日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Cf Edu #47 F】Dominant Indices(长链剖分)

發(fā)布時間:2024/10/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Cf Edu #47 F】Dominant Indices(长链剖分) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

要求每個點子樹中節(jié)點最多的層數(shù),一個通常的思路是樹上啟發(fā)式合并,對于每一個點,保留它的重兒子的貢獻,暴力掃輕兒子將他們的貢獻合并到重兒子里來。

參考重鏈剖分,由于一個點向上最多只有$log$條輕邊,故每個點最多被合并$log$次。但這不是這題想說的。

由于我們只保留以深度為下標的信息,重鏈剖分就會多算,以此引出長鏈剖分,權(quán)且作為一個模板來學習。

長鏈剖分時,每個點以最深的兒子作為長兒子,其余為短兒子。

每個點$O(1)$繼承長兒子的信息,將短兒子的信息合并上來。每個點只有作為短兒子時才保留以它為鏈頭的一條長鏈上的信息,空間復雜度為$O(鏈長)$。

顯然,每次短兒子被合并之后就不會再被訪問到了,因為它合并到了一條比它更長的鏈,而所有的長鏈都不相交,每條鏈都以$O(鏈長)$被合并掉,故總復雜度是$O(n)$的。

這道題只要維護深度為$i$的節(jié)點的數(shù)量,取最大值即可。

?

$\bigodot$技巧&套路:

  • 以深度為下標的信息,可以考慮長鏈剖分。
  • 通常信息的合并,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(长链剖分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。