当做Splay的模板来用比较好?因为蒟蒻不会Splay= =
简直要跪了。。。调个Splay从中午一直写到晚上。。。还能去考NOI嘛%>_<%
我去真的就是裸的数列操作的说啊!
1 /************************************************************** 2 Problem: 1251 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:7092 ms 7 Memory:2572 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 #define lson tr[p].son[0] 14 #define rson tr[p].son[1] 15 #define Tag tr[p].tag 16 #define Key tr[p].key 17 #define Mx tr[p].mx 18 #define Sz tr[p].sz 19 #define Rev tr[p].rev 20 using namespace std; 21 const int inf = (int) 1e9; 22 const int N = 50005; 23 24 struct Splay_node { 25 int key, tag, mx, sz, fa, son[2]; 26 bool rev; 27 } tr[N]; 28 29 int n, a[N]; 30 int tot, root; 31 int r1, r2; 32 33 inline int read() { 34 int x = 0, sgn = 1; 35 char ch = getchar(); 36 while (ch < '0' || '9' < ch) { 37 if (ch == '-') sgn = -1; 38 ch = getchar(); 39 } 40 while ('0' <= ch && ch <= '9') { 41 x = x * 10 + ch - '0'; 42 ch = getchar(); 43 } 44 return sgn * x; 45 } 46 47 inline void pushdown(int p) { 48 if (!p) return; 49 if (Rev) { 50 swap(lson, rson); 51 tr[lson].rev ^= 1, tr[rson].rev ^= 1; 52 Rev = 0; 53 } 54 if (Tag != 0) { 55 Key += Tag, Mx += Tag; 56 tr[lson].tag += Tag, tr[rson].tag += Tag; 57 Tag = 0; 58 } 59 } 60 61 inline void update(int p) { 62 pushdown(p); 63 pushdown(lson), pushdown(rson); 64 Sz = tr[lson].sz + tr[rson].sz + 1; 65 Mx = max(Key, max(tr[lson].mx, tr[rson].mx)); 66 } 67 68 inline void rotate(int p, int &k) { 69 int Fa = tr[p].fa, Gr = tr[Fa].fa; 70 int l = (tr[Fa].son[1] == p), r = !l; 71 if (Fa == k) k = p; 72 else tr[Gr].son[tr[Gr].son[1] == Fa] = p; 73 tr[p].fa = Gr, tr[Fa]. fa = p, tr[tr[p].son[r]].fa = Fa; 74 tr[Fa].son[l] = tr[p].son[r], tr[p].son[r] = Fa; 75 update(Fa), update(p); 76 } 77 78 void splay(int p, int &k) { 79 int Fa, Gr; 80 while (p != k) { 81 Fa = tr[p].fa, Gr = tr[Fa].fa; 82 if (Fa != k) 83 if ((Fa == tr[Gr].son[0]) ^ (p == tr[Fa].son[0])) 84 rotate(p, k); 85 else rotate(Fa, k); 86 rotate(p, k); 87 } 88 } 89 90 int select(int p, int rank) { 91 pushdown(p); 92 if (tr[lson].sz + 1 == rank) 93 return p; 94 if (tr[lson].sz >= rank) 95 return select(lson, rank); 96 return select(rson, rank - tr[lson].sz - 1); 97 } 98 99 inline void split(int l, int r) { 100 r1 = select(root, l); 101 r2 = select(root, r); 102 splay(r1, root); 103 splay(r2, tr[r1].son[1]); 104 } 105 106 void build(int &p, int l, int r) { 107 p = ++tot; 108 int mid = l + r >> 1; 109 Key = a[mid]; 110 if (l == r) { 111 Sz = 1, Mx = Key; 112 return; 113 } 114 if (l < mid) 115 build(lson, l, mid - 1); 116 tr[lson].fa = p; 117 if (mid < r) 118 build(rson, mid + 1, r); 119 tr[rson].fa = p; 120 update(p); 121 } 122 123 int main() { 124 int Q, oper, x, y, z; 125 n = read() + 2, Q = read(); 126 a[1] = a[n] = -inf; 127 build(root, 1, n); 128 tr[0].mx = -inf; 129 while (Q--) { 130 oper = read(), x = read(), y = read(); 131 if (oper == 1) { 132 z = read(); 133 split(x, y + 2); 134 tr[tr[r2].son[0]].tag += z; 135 } else 136 if (oper == 2) { 137 split(x, y + 2); 138 tr[tr[r2].son[0]].rev ^= 1; 139 } else 140 if (oper == 3) { 141 split(x, y + 2); 142 update(r2); 143 printf("%d\n", tr[tr[r2].son[0]].mx); 144 } 145 } 146 return 0; 147 }
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen