虛樹學習小結

2021-08-07 04:41:30 字數 534 閱讀 7395

其實虛樹這東西…不知道說什麼好…簡單易學呃

虛樹主要處理一種詢問總點數不超過o(n),且每次詢問的那些點,在預處理之後,所求的值,只和他們,以及他們兩兩的lca有關

這裡有個顯然的結論,即m個點兩兩的lca不超過m-1個,將這m個點按dfs序排序之後相鄰兩點的m-1個lca就是這m個點兩兩的lca

建立虛樹的過程,實際上是把那些在樹上但是與詢問無關的點剔除,只剩下會對答案產生貢獻的點,接著挺多題就是在虛樹上dp了,因為詢問總點數不超過o(n),每次建立虛樹用到的點不超過每次詢問點數的2倍,所以除去排序,lca的複雜度,虛樹的時空複雜度都是o(n)的

具體實現的話,先把虛樹要用到的點找出來,然後設個根(根出不出現在詢問裡都行)放在隊頭,接著按照dfs序插入佇列,如果隊尾不是當前點的祖先就pop掉隊尾,否則隊尾的點向當前點連邊,判是否是祖先可以用括號序列。

細節方面的話,陣列、邊目錄的清空要注意一下,然後虛樹中有些點不是詢問的點,所以要弄個陣列記錄這個點是不是當前詢問的點

虛樹的題…編碼複雜度不高,細節好像也沒什麼,就是**有點長(還是我自己的問題?)

虛樹學習小結

從一道模板題說起 void ins int x 注意與上面的區別 while top 1 dfn s top 1 dfn k add1 s top 1 s top top if s top k add1 k,s top s top k s top x void son int x l1 d con ...

虛樹學習筆記

將關鍵點按dfs序排序後,所有關鍵點與相鄰關鍵點的lca合起來構成虛樹 通常還要加上整棵樹的根 虛樹至多有2k2k 個點。體現在實現中就是每次都pop若干點,並有機會push2個點。stk中存的是從根到當前點的遞迴棧中目前選入虛樹的點。stk中的點之間都未連邊 因為事實上關係還未確定 pop掉乙個點...

虛樹 學習筆記

水平不夠,學習來湊 又開了個天大的新坑 sdoi 2011 消耗戰 題目大意就是講 給出一棵樹,有邊權,然後給出k個查詢點,問從1號店不能到任何乙個查詢點的代價是多少.先考慮一下樹形動歸.dp i 表示從1不能到以i為根的子樹中的所有查詢點的最小代價 考慮維護乙個量,mins i 表示從1到i路徑最...