传送门
维护数列
时间限制:1秒 内存限制:128M
题目描述
请写一个程序,要求维护一个数列,支持以下6种操作:
编号 名称 格式 说明
1 插入 INSERT posi tot c ; 在当前数列的第posi个数字后插入tot个数字:c1,c2.....ctot;若在数列首插入,则 posi为 0
2 删除 DELETE posi tot 从当前数列的第posi 个数字开始连续删除tot 个数字
3 修改 MAKE-SAME posi tot c 从当前数列的第 posi个数字开始的连续 tot个数字统一修改为 c
4 翻转 REVERSE posi tot 取出从当前数列的第 posi个数字开始的 tot个数字,翻转后放入原来的位置
5 求和 GET-SUM posi tot 计算从当前数列的第 posi个数字开始的 tot个数字的和并输出
6 求最大子列和 MAX-SUM 求出当前数列中和最大的一段子列,并输出最大和
输入描述
第一行包含两个整数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。
第二行包含 N 个数字,描述初始时的数列。以下 M 行,每行一条命令,格式参见问题描述中的表格。
输出描述
对于输入数据中的GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。
样例
输入
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 10 1 10
这道题我们考虑用SPLAY平衡树做
对于六个操作
1.区间插入
我们可以先建一颗子树
来存储区间插入的值
然后让子树与本树建立联系
就可以区间插入了
建树
void build(int begin,int end,int fa) {
int mid=(begin+end)>>1,node=id[mid],pre=id[fa];
if(begin==end)
New(node,a[begin]);
if(begin<mid)
build(begin,mid-1,mid);
if(mid<end)
build(mid+1,end,mid);
tree[node].val=a[mid];
tree[node].fa=pre;
tree[node].tag=TAGNONE;
pushup(node);
tree[pre].ch[mid>=fa]=node;
}
插入
voi

本文介绍如何利用Splay平衡树实现一个程序,维护一个数列并支持6种操作:插入、删除、修改、翻转、求和及求最大子列和。详细解释了每个操作的实现思路,并提供了样例输入输出以及关键代码片段。
最低0.47元/天 解锁文章
674

被折叠的 条评论
为什么被折叠?



