Bzoj 3223/tyvj 1729 splay tree, bzojtyvj

Source: Internet
Author: User

Bzoj 3223/tyvj 1729 splay tree, bzojtyvj

Original question link: http://www.tyvj.cn/p/1729

The splay tree, which was previously written in C language, has passed ..

Now I have access to c ++ rewrite...

Only interval flip is involved. Because there is no delete operation, no garbage collection is required. The details are as follows:

1 # include <cstdio> 2 # include <cstdlib> 3 # include <iostream> 4 # include <algorithm> 5 const int MAX_N = 100010; 6 struct Node {7 int v, s, rev; 8 Node * pre, * ch [2]; 9 inline void set (int _ v = 0, int _ s = 0, Node * p = NULL) {10 v = _ v, s = _ s, rev = 0; 11 pre = ch [0] = ch [1] = p; 12} 13 inline void push_up () {14 s = ch [0]-> s + ch [1]-> s + 1; 15} 16 inline void update () {17 Node * t = ch [0]; 18 rev ^ = 1; 19 t = ch [0]; 20 ch [0] = ch [1]; 21 ch [1] = t; 22} 23 inline void push_down () {24 if (rev! = 0) {25 rev ^ = 1; 26 ch [0]-> update (); 27 ch [1]-> update (); 28} 29} 30 }; 31 struct SplayTree {32 Node stack [MAX_N]; 33 Node * tail, * root, * null; 34 inline Node * newNode (int v) {35 Node * p = tail ++; 36 p-> set (v, 1, null); 37 return p; 38} 39 void initialize (int l, int r) {40 tail = & stack [0]; 41 null = tail ++; 42 null-> set (-1); 43 root = newNode (-1 ); 44 root-> ch [1] = newNode (-1); 45 root-> ch [1]-> Pre = root; 46 Node * x = built (l, r); 47 root-> ch [1]-> ch [0] = x; 48 x-> pre = root-> ch [1]; 49 root-> ch [1]-> push_up (); 50 root-> push_up (); 51} 52 inline void rotate (Node * x, int c) {53 Node * y = x-> pre; 54 y-> push_down (), x-> push_down (); 55 y-> ch [! C] = x-> ch [c]; 56 x-> pre = y-> pre; 57 if (x-> ch [c]! = Null) x-> ch [c]-> pre = y; 58 if (y-> pre! = Null) y-> pre-> ch [y-> pre-> ch [0]! = Y] = x; 59 x-> ch [c] = y; 60 y-> pre = x; 61 y-> push_up (); 62 if (y = root) root = x; 63} 64 void splay (Node * x, Node * f) {65 if (x = root) return; 66 for (; x-> pre! = F; x-> push_down () {67 if (x-> pre = f) {68 rotate (x, x-> pre-> ch [0] = x); 69} else {70 Node * y = x-> pre, * z = y-> pre; 71 if (z-> ch [0] = y) {72 if (y-> ch [0] = x) 73 rotate (y, 1 ), rotate (x, 1); 74 else rotate (x, 0), rotate (x, 1 ); 75} else {76 if (y-> ch [1] = x) 77 rotate (y, 0), rotate (x, 0); 78 else rotate (x, 1), rotate (x, 0); 79} 80} 81} 82 x-> push_up (); 83} 84 Node * built (int l, I Nt r) {85 Node * p = null; 86 if (l> r) return null; 87 int mid = (l + r)> 1; 88 p = newNode (mid); 89 p-> ch [0] = built (l, mid-1); 90 if (p-> ch [0]! = Null) p-> ch [0]-> pre = p; 91 p-> ch [1] = built (mid + 1, r ); 92 if (p-> ch [1]! = Null) p-> ch [1]-> pre = p; 93 p-> push_up (); 94 return p; 95} 96 Node * select (Node * x, int k) {97 int t = 0; 98 Node * ret = x; 99 for (;) {100 ret-> push_down (); 101 t = ret-> ch [0]-> s; 102 if (t = k) break; 103 if (k <t) ret = ret-> ch [0]; 104 else k-= t + 1, ret = ret-> ch [1]; 105} 106 return ret; 107} 108 void travel (Node * x) {109 if (x! = Null) {110 x-> push_down (); 111 travel (x-> ch [0]); 112 printf ("% d", x-> v ); 113 travel (x-> ch [1]); 114} 115} 116 Node * get_range (int l, int r) {117 splay (select (root, l-1 ), null); 118 splay (select (root, r + 1), root); 119 return root-> ch [1]-> ch [0]; 120} 121 void reverse (int l, int r) {122 Node * ret = get_range (l, r); 123 ret-> update (); 124} 125 void print (int n) {126 Node * ret = get_range (1, n); 127 travel (ret); 128} 129} Splay; 130 int main () {131 # ifdef LOCAL132 freopen ("in.txt", "r", stdin); 133 freopen ("out.txt ", "w +", stdout); 134 # endif135 int n, m, a, B; 136 while (~ Scanf ("% d", & n, & m) {137 Splay. initialize (1, n); 138 while (m --) {139 scanf ("% d", & a, & B); 140 Splay. reverse (a, B); 141} 142 Splay. print (n); 143} 144 return 0; 145}View Code

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.