splay伸展树
来源:互联网 发布:推荐充电宝 知乎 编辑:程序博客网 时间:2024/06/02 06:08
#include <iostream>#include <cstdlib>#include <climits>using namespace std;typedef struct node { int key, val, num, lazy; long totalVal; struct node *left, *right, *father;}Node;Node* createNode(int key, int val) { Node *node = (Node*)malloc(sizeof(Node)); node->key = key; node->val = val; node->num = 1; node->totalVal = val; node->lazy = 0; node->left = NULL; node->right = NULL; node->father = NULL; return node;}void update(Node *x) { //here must initialize x->num = 1; x->totalVal = x->val; if (x->left) { x->num += x->left->num; x->totalVal += x->left->totalVal; } if (x->right) { x->num += x->right->num; x->totalVal += x->right->totalVal; }}void marking(Node *x, int data) { x->lazy += data; x->totalVal += x->num * data; x->val += data;}void send(Node *x) { if (x->left) marking(x->left, x->lazy); if (x->right) marking(x->right, x->lazy); x->lazy = 0; update(x);}void left_rotate(Node *x) { Node *p = x->father; send(p); send(x); x->father = p->father; if (p->father) { if (p->father->left == p) p->father->left = x; else p->father->right = x; } p->right = x->left; if (x->left) x->left->father = p; x->left = p; p->father = x; update(p); update(x);}void right_rotate(Node *x) { Node *p = x->father; send(p); send(x); x->father = p->father; if (p->father) { if (p->father->left == p) p->father->left = x; else p->father->right = x; } p->left = x->right; if (x->right) x->right->father = p; x->right = p; p->father = x; update(p); update(x);}//y must be ancestor of x, make x son of yvoid splay(Node *x, Node *y) { while (x->father != y) { Node *p = x->father; if (p->father == y) { if (p->left == x) right_rotate(x); else left_rotate(x); } else { Node *g = p->father; if (g->left == p) { if (p->left == x) { right_rotate(p); right_rotate(x); } else { left_rotate(x); right_rotate(x); } } else { if (p->right == x) { left_rotate(p); left_rotate(x); } else { right_rotate(x); left_rotate(x); } } } }}Node* bst_insert(Node *root, int key, int val) { if (!root) return createNode(key, val); if (root->key == key) return root; send(root); if (root->key < key) { root->right = bst_insert(root->right, key, val); root->right->father = root; } else { root->left = bst_insert(root->left, key, val); root->left->father = root; } update(root); return root;}Node* bst_find(Node *root, int key) { if (!root) return NULL; if (root->key == key) return root; if (root->key < key) return bst_find(root->right, key); else return bst_find(root->left, key);}Node* insert(Node *root, int key, int val) { root = bst_insert(root, key, val); Node *temp = bst_find(root, key); splay(temp, NULL); return temp;}Node* findPrev(Node *root) { Node *node = root->left; while (node->right) node = node->right; return node;}Node* findNext(Node *root) { Node *node = root->right; while (node->left) node = node->left; return node;}Node* deleteN(Node *root) { Node *prev = findPrev(root); Node *next = findNext(root); splay(prev, NULL); splay(next, prev); next->left = NULL; return prev;}Node* findPrev(Node *root, int key) { Node *temp = bst_find(root, key); if (temp) { splay(temp, NULL); temp = findPrev(temp); splay(temp, NULL); return temp; } else { return deleteN(insert(root, key, 0)); }}Node* findNext(Node *root, int key) { Node *temp = bst_find(root, key); if (temp) { splay(temp, NULL); temp = findNext(temp); splay(temp, NULL); return temp; } else { return deleteN(insert(root, key, 0))->right; }}Node* query(Node *root, int a, int b) { Node *prev = findPrev(root, a); Node *next = findNext(prev, b); splay(prev, NULL); splay(next, prev); return prev;}Node* manage(Node *root, int a, int b, int d) { Node *prev = findPrev(root, a); Node *next = findNext(prev, b); splay(prev, NULL); splay(next, prev); marking(next->left, d); root = next->left; splay(root, NULL); return root;}Node* deleteN(Node *root, int a, int b) { root = insert(root, a, 0); Node *prev = findPrev(root); root = insert(root, b, 0); Node *next = findNext(root); splay(prev, NULL); splay(next, prev); next->left = NULL; return prev;}int main(){ int n, a, b, d; char c; Node *root = NULL; root = insert(insert(root, INT_MAX, 0), INT_MIN, 0); cin >> n; for (int i = 0; i < n; i++) { cin >> c; switch (c) { case 'I': cin >> a >> b; root = insert(root, a, b); break; case 'Q': cin >> a >> b; root = query(root, a, b); cout << root->right->left->totalVal << endl; break; case 'M': cin >> a >> b >> d; root = manage(root, a, b, d); break; case 'D': cin >> a >> b; root = deleteN(root, a, b); break; default: break; } } return 0;}
0 0
- 伸展树(splay树)
- Splay树(伸展树)
- Splay Tree(伸展树)
- Splay Tree 伸展树
- Splay伸展树&模板
- Splay 伸展树
- 伸展树splay tree
- Splay Tree(伸展树)
- splay tree(伸展树)
- 【数据结构】伸展树 Splay
- 伸展树(Splay tree)
- 伸展树(Splay tree)
- 伸展树-splay
- 伸展树splay+uva11922
- Splay Tree(伸展树)
- splay - tree 伸展树
- 伸展树Splay Tree
- bzoj1208 splay伸展树
- linux swap分区使用指南
- 102.You want to import schema objects of the HR user using Oracle Data Pump from the development dat
- Android多线程消息处理机制(一) Looper、Thread专题
- 自定义复选框checkbox样式
- HDOJ 3791 二叉搜索树(二叉树)
- splay伸展树
- 递归的应用-获取body的后代元素
- CodeForces 339D Xenia and Bit Operations 数据结构+线段树+点更新
- Java 中的 static 使用之静态变量·静态方法·静态初始化块
- java中的冒泡排序
- HDOJ 5428 The Factor(分解质因数)
- 绝对定位的特点
- [平衡树] [Tyvj P1728] 普通平衡树 (balanced)
- 开始ITGEGE教育社区的视频录制----嵌入式基础知识讲解