insertion, deletion, precursor successor, K-value, rank, maximum minimum 8 kinds of inquiry take-away core L-Maintain
Complete Template Integration
Write it from 16:10 and write it to 16:28
Total time 18min approx. (Error not exceeding 1min)
My hands are really fast. Owo
This time it was a little test. It seems that SBT has been proficient in writing 0-0
You can go down to splay and Fhqtreap and the like. www
P.S. It's not wrong. If there's something wrong, someone can tell me Quq
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include < Algorithm>using namespace Std;struct sbt{int left,right,size,data;} Tree[100000];int top,root;int n;int opt;int key;void left_rot (int &x) {int y=tree[x].right;tree[x].right=tree[y]. left;tree[y].left=x;tree[y].size=tree[x].size;tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1; X=y;} void Right_rot (int &x) {int y=tree[x].left;tree[x].left=tree[y].right;tree[y].right=x;tree[y].size=tree[x]. Size;tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1;x=y;} void maintain (int &x,bool flag) {if (!flag) {if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size) Right_rot (x); ElseIf (tree[tree[tree[x].left].right].size>tree[tree[x].right].size) Left_rot (Tree[x].left), Right_rot (x); elsereturn;} Else{if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size) Left_rot (x); ElseIf (Tree[tree[tree[x]. Right].left].size>tree[tree[x].left].size) Right_rot (tree[x].right), Left_rot (x); elsereturn;} Maintain (tree[x].left,0); Maintain (tree[x].right,1); Maintain (x,1); Maintain (x,0);} void Insert (int &x,int data) {if (x==0) {x=++top;tree[x].size=1;tree[x].left=tree[x].right=0;tree[x].data=data;} Else{tree[x].size++;if (data<tree[x].data) Insert (tree[x].left,data); else insert (tree[x].right,data); Maintain (X,data>=tree[x].data);}} int remove (int &x,int data) {tree[x].size--;if (data>tree[x].data) remove (tree[x].right,data); ElseIf (data< Tree[x].data) Remove (Tree[x].left,data), else{if (tree[x].left!=0&&tree[x].right==0) {int ret=x;x=tree[x]. Left;return x;} ElseIf (tree[x].right!=0&&tree[x].left==0) {int ret=x;x=tree[x].right;return x;} ElseIf (tree[x].left==0&&tree[x].right==0) {int ret=x;x=0;return ret;} Else{int ret=tree[x].right;while (tree[ret].left) ret=tree[x].left;tree[x].data=tree[ret].data;remove (Tree[x]. Right,tree[ret].data);}}} int select (int &x,int k) {int r=tree[tree[x].left].size+1;if (k<r) return Select (Tree[x].left,k), ElseIf (k>r) return select (Tree[x].right,k-r); Elsereturn Tree[x].data;} int rank (int &x,int data) {if (x==0) return 0;if (Data>tree[x].data) return Tree[tree[x].left].size+1+rank (tree[x ].right,data); ElseIf (Data<tree[x].data) return rank (tree[x].left,data); Elsereturn tree[tree[x].left].size+1;} int prev (int &x,int y,int data) {if (x==0) return y;if (Data>=tree[x].data) return prev (tree[x].right,x,data); else Return prev (tree[x].left,y,data);} int succ (int &x,int y,int data) {if (x==0) return y;if (Data>=tree[x].data) return succ (tree[x].right,y,data); else return succ (Tree[x].left,x,data);} int getmin () {int x=root;while (tree[x].left) X=tree[x].left;return Tree[x].data;} int Getmax () {int x=root;while (tree[x].right) X=tree[x].right;return Tree[x].data;} int main () {scanf ("%d", &n), for (int i=1;i<=n;i++) {scanf ("%d", &opt), and switch (opt) {case 1:scanf ("%d",& Key), insert (Root,key), Break;case 2:scanf ("%d", &key);p rintf ("%d\N ", Rank (Root,key)), Break;case 3:scanf ("%d ", &key);p rintf ("%d\n ", select (Root,key)), Break;case 4:printf ("%d\n ", Getmax ()); Break;case 5:printf ("%d\n", Getmin ()) Break;case 6:scanf ("%d", &key);p rintf ("%d\n", Succ (Root,0,key)) ; Break;case 7:scanf ("%d", &key);p rintf ("%d\n", prev (Root,0,key)), Break;case 8:scanf ("%d", &key); Remove (root , key);}}}
"Consolidate" SBT templates (all actions)