模板 資料結構 Treap

2022-03-05 16:05:06 字數 2541 閱讀 8189

還有人把treap叫做樹堆的,但是常用名還是叫做treap的比較多。

不進行任何封裝的,帶求和操作的,乙個節點存放多個元素的最普通的treap。

#includeusing namespace std;

typedef long long ll;

#define ls ch[id][0]

#define rs ch[id][1]

const int inf = 1e9;

const int maxn = 1000000 + 5;

int ch[maxn][2], dat[maxn];

int val[maxn];

int cnt[maxn];

int siz[maxn];

ll sum[maxn];

int tot, root;

inline void init()

inline int newnode(int v, int num)

inline void pushup(int id)

inline void rotate(int &id, int d)

//插入num個v

inline void insert(int &id, int v, int num)

pushup(id);

}}//刪除至多num個v

void remove(int &id, int v, int num) else if(ls || rs) else

id = 0;

} else

}}//查詢v的排名,排名定義為v)

id = ls;

else if(val[id] == v) else

}return res;

}//查詢排名為rk的數,rk必須是正整數,rk過大返回無窮

int getvalue(int id, int rk) else

}return res;

}//查詢v的前驅的值(v的第乙個節點的值),不存在後繼返回無窮

int getnext(int id, int v)

return res;

}//查詢小於等於v的數的和

ll getsumvalue(int id, int v) else

}return res;

}//查詢前rk個數的和,rk必須是正整數

ll getsumrank(int id, int rk) else

}return res;

}

封裝了val的,速度略微下降,因為是鍵值對所以求和類的函式變得沒什麼意義。

struct treapnode 

treapnode(int val1, int val2): val1(val1), val2(val2) {}

bool operator<(const treapnode& tn)const

bool operator<=(const treapnode& tn)const

bool operator==(const treapnode& tn)const

bool operator>=(const treapnode& tn)const

bool operator>(const treapnode& tn)const

} tninf(inf, inf);

/*#define treapnode pii

treapnode tninf(inf, inf);*/

struct treap

int newnode(treapnode v, int num)

void pushup(int id)

void rotate(int &id, int d)

//插入num個v

void _insert(int &id, treapnode v, int num)

pushup(id);}}

//刪除至多num個v

void _remove(int &id, treapnode v, int num) else if(ls || rs) else

id = 0;

} else }}

//查詢v的排名,排名定義為v)

id = ls;

else if(val[id] == v) else

}return res;

}//查詢排名為rk的數,rk必須是正整數,rk過大返回無窮

treapnode _getvalue(int id, int rk) else

}return res;

}int size()

void insert(treapnode v, int num = 1)

void remove(treapnode v, int num = inf)

int getrank(treapnode v)

treapnode getvalue(int rk)

#undef ls

#undef rs

}

資料結構 Treap

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

資料結構之Treap

1.概述 同splay tree一樣,treap也是乙個平衡二叉樹,不過treap會記錄乙個額外的資料,即優先順序。treap在以關鍵碼構成二叉搜尋樹的同時,還按優先順序來滿足堆的性質。因而,treap tree heap。這裡需要注意的是,treap並不是二叉堆,二叉堆必須是完全二叉樹,而trea...

演算法 資料結構 Treap

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,l...