一道splay的模板题,收录
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <cstring> #include <stack> #include <cctype> #include <utility> #include <map> #include <string> #include <climits> #include <set> #include <string> #include <sstream> #include <utility> #include <ctime> using std::priority_queue; using std::vector; using std::swap; using std::stack; using std::sort; using std::max; using std::min; using std::pair; using std::map; using std::string; using std::cin; using std::cout; using std::set; using std::queue; using std::string; using std::istringstream; using std::getline; using std::make_pair; using std::greater; const int MAXN(2100000); struct SPLAY_TREE { struct NODE { char data; int reverse; int size; NODE *fa; NODE *ch[2]; }; NODE pool[MAXN]; NODE *root, *NIL, *rear; NODE *ll, *rl; void push_up(NODE *sour) { sour->size = sour->ch[0]->size+sour->ch[1]->size+1; } void push_down(NODE *sour) { if(sour->reverse) { sour->ch[0]->reverse ^= 1; sour->ch[1]->reverse ^= 1; swap(sour->ch[0], sour->ch[1]); sour->reverse = 0; } } void init() { NIL = pool; rear = pool+1; NIL->data = ' '; NIL->size = 0; NIL->reverse = 0; NIL->fa = NIL->ch[0] = NIL->ch[1] = NIL; newnode(root, NIL, ' '); newnode(root->ch[1], root, ' '); ll = root; rl = root->ch[1]; push_up(rl); push_up(ll); } void newnode(NODE *&sour, NODE *f, char td) { rear->data = td; rear->size = 1; rear->fa = f; rear->reverse = 0; rear->ch[0] = rear->ch[1] = NIL; sour = rear++; } void rotate(NODE *sour, int flag) { NODE *f = sour->fa; push_down(f); push_down(sour); f->ch[!flag] = sour->ch[flag]; sour->ch[flag]->fa = f; sour->fa = f->fa; if(f->fa != NIL) f->fa->ch[f->fa->ch[1] == f] = sour; sour->ch[flag] = f; f->fa = sour; push_up(f); } void splay(NODE *sour, NODE *goal) { push_down(sour); while(sour->fa != goal) { if(sour->fa->fa == goal) rotate(sour, sour->fa->ch[0] == sour); else { NODE *f = sour->fa; int flag = (f->fa->ch[0] == f); if(f->ch[flag] == sour) rotate(sour, !flag); else rotate(f, flag); rotate(sour, flag); } } push_up(sour); if(goal == NIL) root = sour; } NODE *select(NODE *sour, int k) { push_down(sour); while(sour != NIL && k != sour->ch[0]->size+1) { if(k <= sour->ch[0]->size) sour = sour->ch[0]; else { k -= sour->ch[0]->size+1; sour = sour->ch[1]; } push_down(sour); } return sour; } void move(int k) { NODE *temp = select(root, k+1); splay(temp, NIL); } void insert(int n) { char td; NODE *temp = select(root->ch[1], 1); splay(temp, root); td = getchar(); newnode(temp->ch[0], temp, td); temp = temp->ch[0]; --n; while(n) { td = getchar(); newnode(temp->ch[1], temp, td); temp = temp->ch[1]; --n; } splay(temp, root); push_up(root); } void Delete(int n) { NODE *temp = select(root->ch[1], n+1); splay(temp, root); temp->ch[0] = NIL; push_up(temp); push_up(root); } void Rotate(int n) { NODE *temp = select(root->ch[1], n+1); splay(temp, root); temp->ch[0]->reverse ^= 1; } void get() { NODE *temp = select(root->ch[1], 1); splay(temp, root); printf("%c\n", temp->data); } void prev() { NODE *temp = select(root->ch[0], root->ch[0]->size); splay(temp, NIL); } void next() { NODE *temp = select(root->ch[1], 1); splay(temp, NIL); } void debug() { debug_(root); printf("\n"); } void debug_(NODE *sour) { if(sour == NIL) return; debug_(sour->ch[0]); putchar(sour->data); debug_(sour->ch[1]); } }; SPLAY_TREE spt; int main() { int n; char str[10]; int op; while(~scanf("%d", &n)) { spt.init(); for(int i = 0; i < n; ++i) { scanf("%s", str); switch(str[0]) { case 'M': scanf("%d", &op); spt.move(op); break; case 'I': scanf("%d", &op); while(getchar() != '\n'); spt.insert(op); break; case 'D': scanf("%d", &op); spt.Delete(op); break; case 'R': scanf("%d", &op); spt.Rotate(op); break; case 'G': spt.get(); break; case 'P': spt.prev(); break; case 'N': spt.next(); break; } // printf("%c\n", spt.root->data); // spt.debug(); } } return 0; }