1. 程式人生 > 實用技巧 >平衡樹——(不旋轉的那種)——fhp heap——可持久化

平衡樹——(不旋轉的那種)——fhp heap——可持久化

一、什麼是fhp treap,有什麼用

  treap,即tree+heap,而且這個tree是BST

  簡單的講,treap是一棵樹,而它有以下幾個性質

       1、樣子就是(或 幾乎是)一顆完全二叉樹

       2、它的節點的值滿足BST——即: 左兒子 <= 根 <= 右兒子

       3、它的節點序號滿足根堆,若令其滿足大根堆——即: 根節點序號 > 左兒子、右兒子 ——而這裡我們用一個隨機的fix陣列來維護(保證結構的隨機性)

--------->fhp treap

  若是有旋treap,則我們通過旋轉樹的方式來保證樹的平衡,

  而對於非旋treap,我們則通過 合併+拆分 來實現

---------------------------->可持久化

  由於我們是合併+拆分,那麼整棵樹的大致結構就不會變,由此可以延伸出 持久化 的作用——要變的建立新節點,新增更改過後的節點並記錄,複製不變的節點——這樣,我們既有了新的一個版本,也保留了原來的版本,於是達到了持久化的目的

那麼來看一道題——

二、例題

    #2782 可持久化序列【模板】

  描述

  您需要維護一個序列,其中需要提供以下操作:

  插入一個數到序列的第 t 版本使其成為序列的第 k項,這個數為 x ;

  刪除序列的第 t 版本的第 k 項;

  查詢序列的第 t 版本的第 k 項。

  第 0 個版本為空序列。修改操作不會影響被修改的版本,而總是產生一個新版本。

  輸入

  第一行有一個正整數 n 表示操作的數量。

  接下來 n 行每行第一個正整數 opt 表示操作的型別,後面有 3 個整數 t,k,x 或 2 個整數 t,k 表示操作的引數。

  輸出

  對於每個查詢操作輸出一行一個數,表示查詢的結果。

樣例輸入
17
1 0 1 1
1 1 1 2
1 2 1 3
2 3 2
3 4 2
1 4 3 4
1 5 1 5
3 3 2
1 3 4 6
1 6 3 7
1 7 1 8
3 8 2
3 7 3
2 8 4
2 9 2
3 11 4
3 10 4

樣例輸出
1
2
3
1
6
4
樣例