【Hihocder 1329】——Splay
2016-07-17 21:44
246 查看
伸展树的插入,区间删除,区间查询,自己手残,debug了半天
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; typedef struct node { int data; node *Left,*Right,*fa; }Node; void Zig(Node *p) { Node *C = p->Left; Node *s = C->Right; Node *fa = p->fa; if(fa) { if(fa->Left == p) fa->Left = C; else fa->Right = C; } C->fa = fa; C->Right = p; p->fa = C; p->Left = s; if(s) s->fa = p; } void Zag(Node *p) { Node *c = p->Right; Node *s = c->Left ; Node *fa = p->fa; if(fa) { if(fa->Left == p) fa->Left = c; else fa->Right = c; } c->fa = fa; p->Right = s; if(s) s->fa = p; c->Left = p; p->fa = c; } Node * Insert(Node *&p,int value,Node *fa) { if(!p) { p = new Node; p->Left = p->Right = NULL; p->fa = fa; p->data = value; return p; } if(p->data == value) return p; if(p->data < value) return Insert(p->Right,value,p); else return Insert(p->Left,value,p); } void Rotate(Node *p,Node *fa) { while(p->fa != fa) { Node *f = p->fa; Node *Gf = f->fa; if(Gf != fa) { if(Gf->Left == f) { if(f->Left == p) { Zig(Gf); Zig(f); } else { Zag(f); Zig(Gf); } } else { if(f->Left == p) { Zig(f); Zag(Gf); } else { Zag(Gf); Zag(f); } } } else { if(f->Left == p) Zig(f); else Zag(f); } } } Node *ans; void Min(Node *p,int value) { if(!p) return ; if(p->data == value) { ans = p; return ; } if(p->data < value) { ans = p; Min(p->Right,value); } else Min(p->Left,value); } void Max(Node *p,int value) { if(!p) return ; if(p->data == value) { ans = p; return ; } if(p->data>value) { ans = p; Max(p->Left,value); } else Max(p->Right,value); } int main() { int n; char op[3]; int l,r; Node *root = NULL; scanf("%d",&n); Insert(root,-INF,NULL); Insert(root,INF,NULL); while(n--) { scanf("%s",op); if(op[0] == 'I') { scanf("%d",&l); Node * p = Insert(root,l,NULL); Rotate(p,NULL); root = p; } else if(op[0] == 'Q') { scanf("%d",&l); ans = NULL; Min(root,l); Rotate(ans,NULL); root = ans; printf("%d\n",ans->data); } else if(op[0] == 'D') { scanf("%d %d",&l,&r); ans = NULL; Min(root,l-1); Rotate(ans,NULL); root = ans; ans = NULL; Max(root,r+1); Rotate(ans,root); root->Right->Left = NULL; } } return 0; }
相关文章推荐
- hdu-2818-Building Block-带权并查集
- ARM地址映射
- spark-submit工具参数说明
- iOS运行时Runtime浅析
- 【SSH进阶】No result defined for action **的解决方案
- 如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口
- 读书笔记-现代操作系统-7多媒体操作系统-7.6多媒体文件系统泛型7.7文件存放
- Java设计模式之Strategy模式
- Map集合HashMap TreeMap的输出方法
- PHPStorm IDE 快捷键(MAC)
- PHP基础知识构造函数与析构函数
- 文本编写Java
- 在ArcEngine中使用Geoprocessing工具-执行工具
- Android数据存储方式简括
- JFreeChart中文乱码解决方法
- 用友畅捷通高级前端笔试题(一)凭借回忆写出
- 插件式开发(四)---关于资源问题
- Java类库1(16.7.12)
- 【基础】——Servlet原理
- codeforces 527C Glass Carving