Splay模板(序列终结者)

我只是一个存模板的,详细的请看这里http://blog.csdn.net/whai362/article/details/47298133

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cctype>
  4 #include <cmath>
  5 #include <set>
  6 #include <map>
  7 #include <list>
  8 #include <queue>
  9 #include <deque>
 10 #include <stack>
 11 #include <string>
 12 #include <vector>
 13 #include <iostream>
 14 #include <algorithm>
 15 #include <stdlib.h>
 16 #include <time.h>
 17 using namespace std;
 18 typedef long long LL;
 19 const int INF = 2e9 + 1e8;
 20
 21 const int MOD = 1e9 + 7;
 22 const double eps = 0.0000000001;
 23
 24 #define MSET(a, b) memset(a, b, sizeof(a))
 25
 26 const int maxn = 1e6 + 10;
 27 int max(int a, int b, int c)
 28 {
 29     return max(a, max(b, c));
 30 }
 31
 32 struct SplayTree
 33 {
 34     struct Node
 35     {
 36         int son[2], big, val, lazy, sz;
 37         bool rev;
 38         void init(int _val)
 39         {
 40             val = big = _val;
 41             sz = 1;
 42             lazy = rev = son[0] = son[1] = 0;
 43         }
 44     } T[maxn];
 45     int root, fa[maxn];
 46     void pushup(int i)
 47     {
 48         T[i].big=T[i].val,T[i].sz=1;
 49         if(T[i].son[0])
 50         {
 51             T[i].big=max(T[i].big,T[T[i].son[0]].big);
 52             T[i].sz+=T[T[i].son[0]].sz;
 53         }
 54         if(T[i].son[1])
 55         {
 56             T[i].big=max(T[i].big,T[T[i].son[1]].big);
 57             T[i].sz+=T[T[i].son[1]].sz;
 58         }
 59     }
 60     void pushdown(int i)
 61     {
 62         if (i == 0)
 63             return;
 64         if (T[i].lazy)
 65         {
 66             for (int k = 0; k < 2; k++)
 67             {
 68                 if (T[i].son[k])
 69                 {
 70                     T[T[i].son[k]].lazy += T[i].lazy;
 71                     T[T[i].son[k]].val += T[i].lazy;
 72                     T[T[i].son[k]].big += T[i].lazy;
 73                 }
 74             }
 75             T[i].lazy = 0;
 76         }
 77         if (T[i].rev)
 78         {
 79             for (int k = 0; k < 2; k++)
 80                 if (T[i].son[k])
 81                     T[T[i].son[k]].rev ^= 1;
 82             swap(T[i].son[0], T[i].son[1]);
 83             T[i].rev = 0;
 84         }
 85     }
 86     /**  旋转操作
 87      * 传入x,旋转x与x的父亲这两个节点;
 88      */
 89     void rotate(int x, int d)
 90     {
 91         int y = fa[x], z = fa[y];
 92         T[y].son[!d] = T[x].son[d], fa[T[x].son[d]] = y;
 93         T[x].son[d] = y, fa[y] = x;
 94         T[z].son[T[z].son[1] == y] = x, fa[x] = z;
 95         pushup(y);
 96     }
 97     void splay(int x, int goal)
 98     {
 99         if (x == goal)
100             return;
101         while (fa[x] != goal)
102         {
103             int y = fa[x], z = fa[y];
104             pushdown(z), pushdown(y), pushdown(x);
105             int dirx = (T[y].son[0] == x), diry = (T[z].son[0] == y);
106             if (z == goal)
107                 rotate(x, dirx);
108             else
109             {
110                 if (dirx == diry)
111                     rotate(y, diry);
112                 else
113                     rotate(x, dirx);
114                 rotate(x, diry);
115             }
116         }
117         pushup(x);
118         if (goal == 0)
119             root = x;
120     }
121     /**
122      * select(pos) 返回第pos+1个元素;
123      */
124     int Select(int pos)
125     {
126         int u = root;
127         pushdown(u);
128         while (T[T[u].son[0]].sz != pos)
129         {
130             if (pos < T[T[u].son[0]].sz)
131                 u = T[u].son[0];
132             else
133             {
134                 pos = pos - (1 + T[T[u].son[0]].sz);
135                 u = T[u].son[1];
136             }
137             pushdown(u);
138         }
139         return u;
140     }
141     void update(int l, int r, int val)
142     {
143         int x = Select(l - 1), y = Select(r + 1);
144         splay(x, 0);
145         splay(y, x);
146         T[T[y].son[0]].val += val;
147         T[T[y].son[0]].big += val;
148         T[T[y].son[0]].lazy += val;
149     }
150     void turn(int l, int r)
151     {
152         int x = Select(l - 1), y = Select(r + 1);
153         splay(x, 0);
154         splay(y, x);
155         T[T[y].son[0]].rev ^= 1;
156     }
157     int query(int l, int r)
158     {
159         int x = Select(l - 1), y = Select(r + 1);
160         splay(x, 0);
161         splay(y, x);
162         return T[T[y].son[0]].big;
163     }
164     int build(int L, int R)
165     {
166         if (L > R)
167             return 0;
168         if (L == R)
169             return L;
170         int mid = (L + R) >> 1, sL, sR;
171         T[mid].son[0] = sL = build(L, mid - 1);
172         T[mid].son[1] = sR = build(mid + 1, R);
173         fa[sL] = fa[sR] = mid;
174         pushup(mid);
175         return mid;
176     }
177
178     void init(int n)
179     {
180         T[0].init(-INF), T[1].init(-INF), T[n + 2].init(INF);
181         for (int i = 2; i <= n + 1; i++)
182             T[i].init(0);
183         root = build(1, n + 2), fa[root] = 0;
184         fa[0] = 0, T[0].son[1] = root, T[0].sz = 0;
185     }
186 } re;
187
188 int main()
189 {
190     int n, m;
191     scanf("%d%d", &n, &m);
192     re.init(n);
193     for (int i = 0, a, b, c, d; i < m; i++)
194     {
195         scanf("%d", &a);
196         if (a == 1)
197         {
198             scanf("%d%d%d", &b, &c, &d);
199             re.update(b, c, d);
200         }
201         else if (a == 2)
202         {
203             scanf("%d%d", &b, &c);
204             re.turn(b, c);
205         }
206         else
207         {
208             scanf("%d%d", &b, &c);
209             printf("%d\n", re.query(b, c));
210         }
211     }
212     return 0;
213 }
214
215 /**************************************************/
216 /**             Copyright Notice                 **/
217 /**  writer: wurong                              **/
218 /**  school: nyist                               **/
219 /**  blog  : http://blog.csdn.net/wr_technology  **/
220 /**************************************************/
时间: 2024-10-20 13:54:25

Splay模板(序列终结者)的相关文章

【bzoj1251】序列终结者 splay

序列终结者 Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思.这道题目 就叫序列终结者吧. [问题描述] 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将[L,R]这个区间内的所有数

BZOJ 1251 序列终结者(Splay)

题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思.这道题目 就叫序列终结者吧.[问题描述] 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将 [L, R] 这个区间内的所有数加上 V. 2. 将 [

【BZOJ】1251: 序列终结者(splay)

http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint... #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #inc

BZOJ 1251: 序列终结者( splay )

先orz一下clj...我的splay跟着他写的... 这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了... -------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream>

[BZOJ1251]序列终结者

试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量--这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个"库"可以依靠,没有什么其他的意思.这道题目 就叫序列终结者吧. [问题描述] 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V. 2.

splay模板

先贴一份不怎么完善的模板,等刷一些题目熟悉之后再来完善.代码参考自kuangbin及cxlove两位大神. splay的基本功能 题目:维护一个数列,支持以下几种操作: 1. 插入:在当前数列第posi 个数字后面插入tot 个数字:若在数列首位插入,则posi 为0. 2. 删除:从当前数列第posi 个数字开始连续删除tot 个数字. 3. 修改:从当前数列第posi 个数字开始连续tot 个数字统一修改为c . 4. 翻转:取出从当前数列第posi 个数字开始的tot 个数字,翻转后放入原

bzoj 1251: 序列终结者 2011-12-20

1251: 序列终结者Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 650  Solved: 277[Submit][Status][Discuss]Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可

【CodeVS4665】序列终结者

Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思.这道题目 就叫序列终结者吧. 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V. 2. 将[L,R

bzoj1500(妥妥的splay模板题)

1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 6366  Solved: 1910 [Submit][Status] Description Input 输入文件的第1行包含两个数N和M,N表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一条命令,格式参见问题描述中的表格. Output 对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次