three(長鏈剖分)
給出一棵 n 個點的無根樹,請在這棵樹上選三個互不相同的節點,使得這個三個節點兩兩之間距離相等,輸出方案數即可。n<=100000
這個題做法很多,但是
O(n)長鏈剖分。。。。。。
請先自行百度。
因為長鏈剖分要節約記憶體,不能儲存每個點的DP陣列,那麼我們得用完重兒子的DP陣列之後就得繼承和修改,不能再調回去。
有一個直觀的想法就是列舉距離3個點都相等的點,這樣如果3個點都在子樹中固然好算(通過長鏈剖分求x子樹內深度為h的點的數量
f[x][h]),可是如果要計算2個點在子樹中還有一個點在上面的話就翻車了,畢竟計算在上面的點的時候,你只能從上往下計算,這樣不僅和我們從下往上的
f(x)的計算順序相反,並且你算的時候還得藉助
f(x)。
正確的思路是列舉一定在最上面的點,即三個點的lca。
然後問題分為求在x子樹內含有兩個深度相同的節點且需求第3個點離x距離為k的方案數
h[x][k]和一個節點深度為k的
f[x][k]
都可以長鏈剖分從下往上遞推,最後就拿h[x][k]和f[x][k]合併就行了。
因為每個輕兒子的長鏈都只會被父親計算一次,總複雜度是
O(n)
但是暴力加剪枝聽說比這跑的更快
相關推薦
three(長鏈剖分)
給出一棵 n 個點的無根樹,請在這棵樹上選三個互不相同的節點,使得這個三個節點兩兩之間距離相等,輸出方案數即可。n<=100000 這個題做法很多,但是 O
【CF1009F】 Dominant Indices (長鏈剖分)
ORC += pre %d str http [1] .com class 題目鏈接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子樹中距離\(u\)為\(i\)的點的個數,則\(f[u][i]=\sum f[v][i-1]\) 長鏈
「vijos」lxhgww的奇思妙想(長鏈剖分)
題目 lxhgww在樹上玩耍時,LZX2019走了過來。lxhgww突然問道:“我現在的k級祖先是誰?”LZX2019答道:“不是我嗎?”。接著lxhgww就用教主之力讓LZX2019消失了,現在他轉過頭準備向你求助。 長鏈剖分的板子(又是亂搞優化暴力) 對於每一個點,我們定義它深度最深
BZOJ4543/BZOJ3522 [POI2014]Hotel加強版(長鏈剖分)
題目好神仙……這個叫長鏈剖分的玩意兒更神仙…… 考慮dp,設\(f[i][j]\)表示以\(i\)為根的子樹中到\(i\)的距離為\(j\)的點的個數,\(g[i][j]\)表示\(i\)的子樹中有\(g[i][j]\)對點深度相同,他們到LCA的距離為\(d\),且他們的LCA到\(i\)的距離為\(d-
2019.01.06 vijos lxhgww的奇思妙想(長鏈剖分)
傳送門 長鏈剖分模板題。 題意簡述:允許 O ( n
雅禮2017 WC模擬(1.21) :看門人(長鏈剖分)
題意: 給一棵樹,邊長度為1且帶有權值,每個點有[li,ri][li,ri] ,求其子樹中經過他的長度在[li,ri][li,ri]的路徑的權值的最小值。 (n≤1e6)(n≤1e6) 題解: 要求O(nlogn)O(nlogn),可以使用長鏈剖分解決
【BZOJ3252】攻略(長鏈剖分,貪心)
貪心 etc mes span cstring || 題解 prior esp 【BZOJ3252】攻略(長鏈剖分,貪心) 題面 BZOJ 給定一棵樹,每個點有點權,選定\(k\)個葉子,滿足根到\(k\)個葉子的所有路徑所覆蓋的點權和最大。 題解 一個假裝是對的貪心: 每
對LCA、樹上倍增、樹鏈剖分(重鏈剖分&長鏈剖分)和LCT(Link-Cut Tree)的學習
LCA what is LCA & what can LCA do ,即最近公共祖先 在一棵樹上,兩個節點的深度最淺的公共祖先就是LCALCALCA (自己可以是自己的祖先) 很簡單,我們可以快速地進入正題了 下圖中的樹,444和555的LCALCA
[WC2010]重建計劃(長鏈剖分版)
www solution www. eight segment std 假設 距離 include 傳送門 Description Solution 時隔多年,補上了這題的長鏈剖分寫法 感覺比點分治要好寫的多 我們假設\(pos\)是當前點的\(dfn\)
HDU 5044 Tree(樹鏈剖分)
int str ans hang line sin _id rgb php HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai
浴谷金秋線上集訓營 T11738 偽神(樹鏈剖分)
ostream algo lap sed hide lose pla std date 先樹鏈剖分,一棵子樹的編號在數組上連續,一條鏈用樹鏈剖分,把這些線段全部取出來,做差分,找到有多少點被>=t條線段覆蓋即可。 #include<iostream
【Luogu3398】倉鼠找sugar(樹鏈剖分)
name -m pac tor int modify 可能 iostream algorithm 【Luogu3398】倉鼠找sugar(樹鏈剖分) 題面 題目描述 小倉鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每個節點的編號為1~n。地下洞穴是一個樹形結構
洛谷P3379 【模板】最近公共祖先(LCA)(樹鏈剖分)
樹鏈剖分 turn 規模 一次 .org pen 整數 src namespace 題目描述 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。 輸入輸出格式 輸入格式: 第一行包含三個正整數N、M、S,分別表示樹的結點個數、詢問的個數和樹根結點的
1036: [ZJOI2008]樹的統計Count(樹鏈剖分)
sca pan blog class str center scu color name 1036: [ZJOI2008]樹的統計Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 19830 Solved:
bzoj3626: [LNOI2014]LCA (樹鏈剖分)
clas con blog top return print post 節點 std 很神奇的方法 感覺是有生之年都想不到正解的這種 考慮對i 到根的節點權值 + 1,則從根到z的路徑和就是lca(i,z)的深度 所以依次把0 ~ n - 1的點權值 + 1 對於
BZOJ4196: [Noi2015]軟件包管理器(樹鏈剖分)
linu scanf 空格 思路 通過 其中 如果 scrip read Description Linux用戶和OSX用戶一定對軟件包管理器不會陌生。通過軟件包管理器,你可以通過一行命令安裝某一個軟件包,然後軟件包管理器會幫助你從軟件源下載軟件包,同時自動解決所有
2018.10.27 bzoj1984: 月下“毛景樹”(樹鏈剖分)
傳送門 唉蒟蒻又退化了,這道sb題居然做了20min,最後發現是 u p d
bzoj4034: [HAOI2015]樹上操作(樹鏈剖分)
bzoj4034 題目描述:給定一個n個點的樹,有m次操作,操作分3種。 1、將某個節點的點權增加x。 &nb
bzoj2243: [SDOI2011]染色(樹鏈剖分)
bzoj2243 樹鏈剖分好題啊! 題目描述:給定一顆n個點的樹,有m個操作,操作有兩種。 1、將節點a到節點
51Nod 1199 - Money out of Thin Air(樹鏈剖分)
【題目描述】 【思路】 樹鏈剖分,兩次dfs將重鏈轉換成連續區間,然後用線段樹維護區間和 #include<bits/stdc++.h> #define node tree[id] #define lson tree[id<<1] #define rson tr