還有人把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...