Splay

参考题目

P3391 【模板】文艺平衡树

https://www.luogu.com.cn/problem/P3391

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列。

其中需要提供以下操作:翻转一个区间,例如原有序序列是 5 4 3 2 15\ 4\ 3\ 2\ 1,翻转区间是 [2,4][2,4] 的话,结果是 5 2 3 4 15\ 2\ 3\ 4\ 1

输入格式

第一行两个正整数 n,mn,m,表示序列长度与操作个数。序列中第 ii 项初始为 ii
接下来 mm 行,每行两个正整数 l,rl,r,表示翻转的区间。

输出格式

输出一行 nn 个正整数,表示原始序列经过 mm 次变换后的结果。

样例 #1

样例输入 #1
5 3
1 3
1 3
1 4
样例输出 #1
4 3 2 1 5

提示

【数据范围】
对于 100%100\% 的数据,1n,m1000001 \le n, m \leq 1000001lrn1 \le l \le r \le n

参考代码

题解

P2042 [NOI2005] 维护数列

https://www.luogu.com.cn/problem/P2042

题目描述

请写一个程序,要求维护一个数列,支持以下 66 种操作:

编号 名称 格式 说明
1 插入 INSERT posi tot c1 c2ctot\operatorname{INSERT}\ posi \ tot \ c_1 \ c_2 \cdots c_{tot} 在当前数列的第 posiposi 个数字后插入 tottot 个数字:c1,c2ctotc_1, c_2 \cdots c_{tot};若在数列首插入,则 posiposi00
2 删除 DELETE posi tot\operatorname{DELETE} \ posi \ tot 从当前数列的第 posiposi 个数字开始连续删除 tottot 个数字
3 修改 MAKE-SAME posi tot c\operatorname{MAKE-SAME} \ posi \ tot \ c 从当前数列的第 posiposi 个数字开始的连续 tottot 个数字统一修改为 cc
4 翻转 REVERSE posi tot\operatorname{REVERSE} \ posi \ tot 取出从当前数列的第 posiposi 个数字开始的 tottot 个数字,翻转后放入原来的位置
5 求和 GET-SUM posi tot\operatorname{GET-SUM} \ posi \ tot 计算从当前数列的第 posiposi 个数字开始的 tottot 个数字的和并输出
6 求最大子列和 MAX-SUM\operatorname{MAX-SUM} 求出当前数列中和最大的一段子列,并输出最大和

输入格式

第一行包含两个整数 NNMMNN 表示初始时数列中数的个数,MM 表示要进行的操作数目。

第二行包含 NN 个数字,描述初始时的数列。以下 MM 行,每行一条命令,格式参见问题描述中的表格。

输出格式

对于输入数据中的 GET-SUM\operatorname{GET-SUM}MAX-SUM\operatorname{MAX-SUM} 操作,向输出文件依次打印结果,每个答案(数字)占一行。

样例 #1

样例输入 #1
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
样例输出 #1
-1
10
1
10

提示

数据规模与约定

题面由 @syksykCCC 提供。

参考代码

题解

  1. Splay
    1. 参考题目
      1. P3391 【模板】文艺平衡树
      2. P2042 [NOI2005] 维护数列