SDWC day4 樹上資料結構

2022-09-21 16:30:08 字數 2115 閱讀 4635

目錄結論推式子,分開考慮每一次操作改變的貢獻。

k=2 是類似於貓樹的思想。

對於一段區間 [l,r],我們找到中點 mid

處理出 每個字尾 x \in [x, mid] 到 mid 的答案,每個字首 x \in [mid + 1, r] 到 mid 的答案。

然後對於左半區間的點到右半區間的點就可以通過一次中轉點到達了。

然後遞迴左右區間即可。

k = 3 是分塊分成三塊?像上面那樣搞?預處理每個塊字尾字首的答案,整塊的答案。

啟發式合併

合併的時候用雜湊表可以實現 o(1) 合併。

然後就可以 o(n logn) 做了。

把修改的區間全都離線下來,一共為 \(a \log n + b\) 個。

然後對所有區間進行桶排。

然後把所有詢問分離掃一遍就可以了。

把度數 > 根號 n 的點分為一類(大點),其他的分為一類(小點)

對於每乙個大點,我們可以用平衡樹去維護。

對於每個小點,我們在查詢的時候暴力查即可。

樹鏈剖分,平衡樹維護一圈節點,但是不維護自己父親和重兒子。然後對於鏈加的操作,發現修改的都是他們重兒子、父親、和自己。

唯一需要修改平衡樹內的點的時候是從乙個鏈跳到另外乙個鏈的時候。然後這種時刻只有 log 次,所以修改起來是 log^2 的。

先跑出全部點的一組最大的 x, y。

然後 x 到根節點,y 到根節點這兩條路徑是還沒有確定的。

然後對於這兩條路徑,從上向下遍歷,把點依次插入 01trie 順便查最大值就 ok 了。

如果做乙個樹上字首和,那麼就可以轉化成路徑端點的異或和。

我們考慮列舉每個子樹。

子樹內選一對點,子樹外選一對點,就可以做到路徑不交了。

子樹外選一對點可以是上面這道題的做法。

對於子樹內選一對點,可以用啟發式合併 + trie

複雜度是 n log^2 n 的。

我們嘗試用上面的套路把他優化到單 log。

如果我們選了一條最大的鏈 (x,y),那麼只能從 x 到根節點,y 到根節點這兩個路徑旁邊的子樹去找了

我們遍歷每個子樹直接用過 trie 去加進去做即可,總共只會加刪 n 次。

如果我們不選這條最大的鏈呢,

我們只要從下向上列舉點,每次把新增的節點加進 trie 即可。

一共要這樣做兩次,加入點的樹也是 o(n) 級別。

然後就做完了。

首先列舉所有顏色、

列舉同種顏色的對。

假設有兩個點 x, y, 那麼如果一條鏈乙個端點在 x 的子樹內,另乙個端點在 y 的子樹內,那肯定是不合法的對吧。

然後我們考慮用更複雜的方式約束。

我們轉化到 dfs 序上。

兩端區間可以轉化到二維平面,

也就是二維平面的某個矩陣是不合法的。

然後把所有這種情況都搞出來放上去

求乙個矩陣面積並然後一減就做完了。

發現瓶頸在於如何做 5 操作。

用樹鏈剖分把樹排成序列,然後乙個 5 操作會涉及 log 個區間,把這 log 個區間拿出來扔進乙個 splay 裡,打個翻轉標記。

然後在按照 log 個區間的大小分割回去就做完了。

先不考慮 2 操作

可以把 1 操作加到單點上,

對於乙個 3 操作詢問 x

我們如果找到乙個 x 到 根的字尾,滿足權值和 >= 這個字尾的長度,就說明它是黑色

我們把所有點初始化為 -1 就可以解決。

然後考慮 2 操作。

顯然不能直接區間清楚,因為有的權值在 x 到根節點這條路徑上。

我們可以查一下根節點的路徑最深延伸到了 x 子樹內多深,然後在 x 這個位置減去延伸的深度,就相當於刪掉了。

原題:p5048 [ynoi2019 模擬賽] yuno loves sqrt technology iii

用 vector 存每個值的位置集合。

假設現在的答案為 a,如果 x 出現 a+1 次,那麼便可以更新

我們可以轉化成 x 在集合中的位置,然後向後延伸 a 個後的位置是不是 <= 這次詢問的區間 r。

如果是的話表示答案可以更新。

空間複雜度 o(n)

好像還要套上值域分塊。

時間複雜度 o((n+m) \sqrt n)

資料結構 樹上莫隊

題意 給定一棵 n 2 leq n leq 10 5 個結點的樹,根結點為 1 號結點,每個結點有顏色 c leq c leq 10 5 然後 m 1 leq m leq 10 5 次詢問,每次詢問給兩個引數 v,k 詢問 v 子樹內,頻次至少有 k 次的顏色有多少種。題解 經典計數顏色的數量,使用...

資料結構自學筆記五 樹(上)

結點間的關係 樹的其他概念 樹的儲存結構 二叉樹寫在結尾的話 樹是n個結點的有限集。n 0時稱為空樹 n 0時為非空樹。在任意一棵非空樹中 有且只有乙個特定的結點,稱為根 root 當樹不只有乙個結點時,其餘節點可分為m個互不相交的有限集,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。乙個結點擁有...

資料結構(4)

1 允許進行插入 刪除操作的一端叫棧頂 2 表的另一端叫棧底 3 當棧中沒有資料元素時稱為空棧 4 插入叫進棧或入棧 5 刪除叫退棧或出棧 特點 後進先出 順序棧typedef struct sqstack 初始化棧 void initstack sqstack s s為棧指標,top為s所指棧的棧...