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操作,向输出文件依次打印结果,每个答案(数字)占一行。

Sample Input

9 8

2 -6 3 5 1 -5 -3 6 3

GET-SUM 5 4

MAX-SUM

INSERT 8 3 -5 7 2

DELETE 12 1

MAKE-SAME 3 3 2

REVERSE 3 6

GET-SUM 5 4

MAX-SUM

Sample Output

-1

10

1

10

HINT

题意:RT

思路:比较好的splay模板题,基本上这题过了,splay的基本操作也就掌握的差不多了,包括向下更新,翻转,这里我在整个序列上增加了两个节点,一端一个,这样可以方便

区间操作,A完这题感觉整个人都傻逼了,其实代码能力怎么样一写这种代码长的题目就检测出来了,感觉要提高代码能力要经常写这些代码老长老长的题~

这里讲一讲怎样用splay提取一段区间,新手看看吧,大神可以一笑而过~~

假设splay所维护的整个区间长度为n,实际长度为n+2,因为开始的时候在左端设置了0节点,在右端设置了n+1节点,设置这两个节点是为了方便区间的提取操作

假设要提取区间[L,R],可以先将第L-1个节点旋转到根,然后再将第R+1个节点旋转到第L-1个节点的下面,现在第R+1个节点的左孩子所覆盖的区间就是[L,R],怎么

样,是不是很简单了,其实我觉得splay的关键操作就三个,1.将j节点旋转到i节点的下面,2.旋转操作,3.区间提取,然后其它的操作像什么push up,push down就

类似于线段树了~

有了区间提取操作做基础以后,现在可以任意插入一段区间,任意删除一段区间,求任意区间的信息(和,最大值等等)

1.在pos位置后面插入一段区间,先将第pos节点旋转到根,再将第pos+1节点旋转到pos节点的下面,现在第pos+1节点一定没有左子树,然后将要插入的区间作为其左

子树,这里可以将要插入的区间先建成一棵平衡树再插入,效率会高一点

2.将[L,R]区间删除,先将第L-1节点旋转到根,再将第R+1节点旋转到L-1节点的下面,然后将R+1节点的左子树赋为null即可

3.查询区间的信息也一样

4.有一点要注意的是,在对整棵splay做修改之后要及时的从修改的地方旋转到根,这就类似于线段树在修改任意一段区间以后要及时的push up操作

难点基本都已攻破,细节看代码,包括push down,push up ,旋转,splay,翻转,得到第k大的节点,得到一段区间等等~

时间: 2024-12-28 01:10:36

bzoj1500(妥妥的splay模板题)的相关文章

bzoj 1588 splay模板题

用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 33333 6 #define inf 0x3f3f3f3f 7 #define lc(x) ch[(x)][0] 8 #define rc(x) ch[(x)

Bzoj 1251: 序列终结者 (Splay 模板题)

题面(太裸太裸,不看也罢) 就是维护一个区间加,区间翻转和区间最大值. 贴一个风格以后可以一直用 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define N 100000 6 #define XX getchar() 7 using namespace std; 8 int ch[N][2],fa[N],rev[N],ad[N],b

在洛谷3369 Treap模板题 中发现的Splay详解

本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原理来进行的.可能会有不妥之处,还请大佬们指出,谢谢! 那么这个题解存在的意义就是让不会敲Splay的人额...会敲Splay啦... 基本思想 数据结构 对于Splay,我定义了一个class类(当成struct就行啦...个人习惯不同啦),定义名称为“Splay”. 之后在类中,我定义了Splay

bzoj2049-洞穴勘测(动态树lct模板题)

Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径.洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通

POJ1442-查询第K大-Treap模板题

模板题,以后要学splay,大概看一下treap就好了. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std; 6 7 const int maxn = 3e5+10; 8 int num[maxn],st[maxn]; 9 10 struct Treap{ 11 int size; 12 int key,fix; 13 Treap *ch[2];

BZOJ1588 [HNOI2002]营业额统计 splay模板

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

莫队算法小结以及模板题

被splay折磨了一个星期还是抄模板都wa,调试的时候查数据都发现数据太大不能查的蒟蒻杨澜决定学习莫队算法, 但是 万万没想到 莫队也到处都是坑 ----------------------------------------------题记 莫队这个东西就是一个非常简♂单的类似动规的东西,也是那种不会就一直不会,一看题解秒懂的题,[虽然我看题解也半天看不懂但是只是第一道题,万事开头难嘛(也许吧)] 莫队算法是一种基于分块的离线算法,主要用来解决一些区间的询问[就是暴力],我们需要做的就是把询问

bzoj3224 普通平衡树 splay模板

题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #define CLR(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int root,N=0,n,p,q; int fa[100001],c[100001][2],size[100001],sp[100001]; void

hdu 2966 In case of failure kdtree模板题

问求每个点距离平方的最小的点 kd-tree模板题…… 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int>