维护数列(Splay 平衡树)

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

传送门

维护数列

时间限制: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值