好像lca的題目並不多,現在就做了10道左右,但是找不到別的了,在此做個小總結,將來有更好的題目會不斷更新
解決lca問題,一般用3種方法
1.樸素方法:兩個點都一直沿路徑往上走,直到有某乙個節點被經過兩次並且是第一次出現這樣的點,那麼這個就是lca
此方法最好理解,但是用得不多,但不代表沒作用,有些題目還是需要用到的
3.tarjan演算法(離線演算法):利用tarjan演算法,不過要先讀入所有詢問再一併回答,建議認真學習tarjan演算法本質
******具體問題具體分析,但是可以使用tarjan演算法的時候推薦使用tarjan演算法,**量少速度快,另外tarjan演算法容易產生變形,值得深究*************
模板題,直接求lca
模板題,不過不是樹是森林,所以某些點不存在lca,要做判斷
任然算是模板題,上面的題要求兩點間的最短距離,這裡要求3點間的最短距離,其實就是兩兩之間求一次lca並計算出距離,然後相加除以2即可
lca + 修改點權值 + 排序:每個點有初始的權值,一邊查詢一邊伴隨著修改某些點的權值,查詢是從a到b路徑中第k大的權值是多少。不需要太多的技巧,修改操作就直接修改,查詢操作先求lca,然後從a走到b儲存下所有的權值,排序,然後直接輸出即可
lca + 修改邊權:一邊查詢兩點間的距離,一邊修改某些邊權。對於修改了某些邊的邊權,就要從此開始遍歷下面的子孫後代更改他們的dir值(點到根的距離)。也不需要太多技巧,直接按題意實現即可,不過時間比較糟糕,用線段樹或樹狀陣列可以對修改操作進行優化,時間提公升很多
連通分量 + lca : 先縮點,再求lca,並且不斷更新,這題用了樸素方法來找lca,並且在路徑上做了一些操作
lca + tree dp : 在執行tarjan處理完所有的lca詢問後,進行一次樹dp,樹dp不難,但是要想到用樹dp並和這題結合還是有點難度
lca + 並查集的變形,優化:好題,難題,思維和**實現都很有難度,需要很好地理解tarjan演算法中並查集的本質然後靈活變形,需要記錄很多資訊(有點dp的感覺)
lca + 二分:好題,有一定思維難度。先建立出二叉樹模型,然後將要查詢的兩個點調整到深度一致,然後二分lca所在的深度,然後檢驗
2017 9 28 lca 失敗總結
序號連續,體現在樹上一點關係都沒有。所以這一條性質用不上就只能暴力了 所以就需要考慮序號連續有什麼用。首先所求的是乙個區間所以就可以用字首和化成兩個點 重要套路 然後求lca往上的距離就可以每個點往上 1,查詢目標點往上的點裡有幾個一 相當於離散差分 然後就可以把兩端的位置都散進字首和裡 然後掃一遍...
總結 LCA的4種求法
lca的求法有多重多樣,總結下來是下面這4種.希望大家可以加油 我們考慮dfs求出每乙個點的父親 在當前根下 然後直接先暴力跳到同乙個深度,再同時跳 void dfs int u,int f int lca int u,int v int lca int a,int b 考慮把乙個樹分成輕鏈與重鏈,...
選拔題目總結
還是總結下吧,恩。共計五道題,gb出了四題,cw一題,四個小時。大概有20多號人參加。老區也有人,反正看ranklist,有交題的大概有二十多個 出題狀況 黨第一 四題 我第二 三題 然後出兩題的大概有6個,出一題的大概有6 7個。總體來看,這次題也不算太難,我覺得出三題算是正常發揮吧。當然我那天可...