演算法 資料結構 Treap

2022-05-11 05:57:34 字數 1980 閱讀 6232

/* treap : 完整版 */

struct treap

void pushup(int u)

void rotate(int &u, int d)

void inserthelp(int &u, ll v, ll c) else if (v == val[u]) else

pushup(u);

}void removehelp(int &u, ll v, ll c) else if (v == val[u]) else if (ls || rs) else

} else

pushup(u);

}ll getrankhelp(int u, ll v) else if (val[u] == v) else if (val[u] > v) else

}ll getvaluehelp(int u, ll r) else if (siz[ls] < r && siz[u] - siz[rs] >= r) else if (siz[ls] >= r) else

}ll getprevhelp(int u, ll v) else if (val[u] < v) else

}ll getnexthelp(int u, ll v) else if (val[u] > v) else

}ll getsumvaluehelp(int u, ll v) else if (val[u] == v) else if (val[u] > v) else

}ll getsumrankhelp(int u, ll r) else if (siz[ls] < r && siz[u] - siz[rs] >= r) else if (siz[ls] >= r) else

}#undef ls

#undef rs

public:

void init()

void insert(ll v, ll c = 1)

void remove(ll v, ll c = 1)

ll getrank(ll v)

ll getvalue(ll r)

ll getprev(ll v)

ll getnext(ll v)

ll getsumvalue(ll v)

ll getsumrank(ll r)

} treap;

節點:指treap的節點,**中用u表示

元素:指val中儲存的值,**中用v表示

注意區分節點和元素的區別。在這個實現中,節點和元素的權值是一一對應的,相同權值的元素會累計到同乙個節點內。

以下字段可能涉及擴充套件性,可能需要修改:

treap_maxn; // treap能容納的最大節點數

linf; // 元素權值的正無窮大

cnt[u]; // 節點u表示的元素數量

siz[u]; // 節點u的子樹的元素數量和

val[u]; // 節點u表示的元素權值

sum[u]; // 節點u的子樹的元素權值和

// 以下「排名」定義為注意:這裡為了方便,新建節點時使用了rand(),這會導致不同平台上執行結果很可能會有差異!

效能特點:

時間複雜度基於元素數量,且為期望複雜度

空間複雜度基於元素數量

執行的常數較小

使用懶標記維護較簡潔

帶旋轉操作,不能可持久化

不像其他資料結構擁有無法取代的「特長」,不同場景下都可以被替代,甚至可以不學

與splay對比:

treap一般情況下常數較小,維護較簡潔,時間複雜度為期望複雜度,但不能維護序列操作,也不支援lct

與動態開點權值線段樹和01trie對比:

treap的時間複雜度和空間複雜度都與值域無關,一般而言節省至少30%,但是不能維護異或操作,也不方便可持久化

演算法(資料結構)

空間不夠儲存 給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 40億個數空間儲存的問題 利用對映 分析 unsigned 範圍是2 32 40億大約大約4g個數不到,常規方法肯定是不行的 我們你可以利用 伴隨陣列 那種思想利用記...

演算法 資料結構

演算法是程式的核心,演算法的好壞直接決定了程式的好壞 基礎的幾種演算法 二分查詢 氣泡排序 插入排序 選擇排序 快速排序 二分查詢 假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功 若x小於當前位置值,則在數列的前半段中查詢 若x大於當前位置值則在數...

資料結構 Treap

前兩天看了byvoid大神寫的treap的 中幾乎給出了所有的 不過最後一部提到了乙個優化,就是對於重複的元素採用在同乙個節點中記錄乙個weight來記錄者個元素使用了多少次的寫法,以及查詢第k個數的功能的實現,我試著寫了乙個,表示樹旋轉之後需要重新設定size有一點點煩。因為找不到合適的題目去測試...