前兩天看了byvoid大神寫的treap的**,**中幾乎給出了所有的**,不過最後一部提到了乙個優化,就是對於重複的元素採用在同乙個節點中記錄乙個weight來記錄者個元素使用了多少次的寫法,以及查詢第k個數的功能的實現,我試著寫了乙個,表示樹旋轉之後需要重新設定size有一點點煩。因為找不到合適的題目去測試這段**,主要是因為這裡採用動態記憶體分配導致**執行速度很慢總是tle,我自己做了一下測試,不過目前只測試了插入功能和查詢功能。刪除功能,查詢第k個數的功能,給定乙個數給出排名的功能還沒有測試過。目標是最終實現乙個類似與stl中map的模板類,同時寫出乙個acm競賽中可用的treap模板(取消記憶體動態分配,採用陣列靜態儲存)。
先把**掛上來先,測試什麼的慢慢來。
已經證實一開始的**是有錯的,treap的刪除操作中,當找到節點時那個--cnt==0的判斷條件需要改一下,因為整個過程涉及遞迴,在下一步遞迴時再次--,cnt就會變成負數。
這只能算個補丁,應該有更好的寫法。
# include # include # include # include # include # include # include # include # include # include # include # include # include using namespace std;
const int debug = 0;
const int size = 1000000 + 10;
typedef long long ll;
# ifndef online_judge
struct desktopio
}dio;
# endif
struct treap_node
treap_node(int _value):value(_value),cnt(0),size(0),left(null),right(null){}
}*root = null;
inline void treap_setsize(treap_node *&p)
}inline int lsize(treap_node *&p)
inline int rsize(treap_node *&p)
void treap_left_rotate(treap_node *&a)
void treap_right_rotate(treap_node *&a)
void treap_insert(treap_node *&p,int value)
if (value < p->value)
else if (p->value < value)
else
treap_setsize(p);
}bool treap_delete(treap_node *&p,int value)
else
else if (p->left->fix < p->right->fix)
else
}} treap_setsize(p);
} return ret;
}treap_node* treap_find(treap_node* root,int value)
return root;
}treap_node* treap_findkth(treap_node *&p,int k)
int treap_rank(treap_node *p,int value,int cur)
void treap_clear(treap_node *&root)
int main()
while (m--)
} return 0;
}
資料結構之Treap
1.概述 同splay tree一樣,treap也是乙個平衡二叉樹,不過treap會記錄乙個額外的資料,即優先順序。treap在以關鍵碼構成二叉搜尋樹的同時,還按優先順序來滿足堆的性質。因而,treap tree heap。這裡需要注意的是,treap並不是二叉堆,二叉堆必須是完全二叉樹,而trea...
模板 資料結構 Treap
還有人把treap叫做樹堆的,但是常用名還是叫做treap的比較多。不進行任何封裝的,帶求和操作的,乙個節點存放多個元素的最普通的treap。includeusing namespace std typedef long long ll define ls ch id 0 define rs ch ...
演算法 資料結構 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...