来灌水区求助以获得帮助
  • 板块灌水区
  • 楼主ღꦿ࿐
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/31 23:43
  • 上次更新2023/11/5 09:21:07
查看原帖
来灌水区求助以获得帮助
161697
ღꦿ࿐楼主2020/10/31 23:43

题目描述 小w最近在学习可持久化数据结构,不过小w越学越困,然后他...他就睡着了。在梦境的世界中,他发现有一种可持久化的变量。只要用这种变量写出来的数据结构,都能变成可持久化数据结构。比如用这种变量开一个数组,这个数组就是一个可持久化数组,用这种变量写一颗线段树,线段树也变成可持久化线段树了。小w梦醒以后十分生气,因为现实中并不存在这么一种能够可持久化的变量。现在他把这个任务交给了你。

现在让你维护一个变量,变量的初始值为0并且该变量的值将不会超过int类型的范围,该变量支持以下四种操作:

ADD(x)操作,该变量的值增加x。

SUB(x)操作,该变量的值减少x。

SET(x)操作,设定该变量的值为x。

BACK(x)操作,回溯之前的x个操作,也就是x一定小于等于之前输入的操作总数(1≤≤x≤≤已经输入的 操作总数)。

例如BACK(1)表示回溯到上次操作前的状态,BACK(3)表示以当前操作为基准回溯到前3次操作前的状态,注意BACK操作本身也算作操作。

你需要在每一个操作之后,输出这个变量现在的值,输出的整数之间用空格隔开,行末不允许有多余空格。

输入描述: 第一行输入一个正整数n,表示操作的个数。 接下来n行,每行输入一个字符串OP和一个整数x。OP只能是"ADD"、"SUB"、"BACK"、"SET"的其中之一,意义见上文。

输出描述: 输出一行n个整数,表示这个变量在每一个操作后的值,输出的整数之间用空格隔开,行末不允许有多余空格。

示例11 输入 7 ADD 2 SUB 3 BACK 1 BACK 1 BACK 1 BACK 2 SET 5

输出 2 -1 2 -1 2 2 5

说明 ①在增加2以后,变量的值为2。 ②在减少3以后,变量的值为-1。 ③向前回溯1次操作后变量的值与①状态时相同,变量的值变为2。 ④向前回溯1次操作后变量的值与②状态时相同,变量的值变为-1。 ⑤向前回溯1次操作后变量的值与③状态时相同,变量的值为2。 ⑥向前回溯2次操作后变量的值与③状态时相同,变量的值为2。 ⑦直接设置变量的值为5。

备注: 对于1010的测试数据,保证1≤n≤10,1≤x≤10001≤n≤10,1≤x≤1000。

对于100100的测试数据,保证1≤n≤105,1≤x≤10001≤n≤105,1≤x≤1000,保证BACK操作中1≤x≤1≤x≤当前已操作总数,并且在运算的过程中以及最终答案不会超过int型所表示的范围。

对于测试点2,在满足100100的测试数据的基础上额外保证只含有ADD、SUB两个操作。

对于测试点3,在满足100100的测试数据的基础上额外保证只含有ADD、SUB、SET三个操作。

#include<bits/stdc++.h>
using namespace std;
int a,h[100001],n;
string s;
int main()
{
	cin>>n;
	h[0]=0;
	for(int i=1;i<=n;++i)
	{
		cin>>s>>a;
		if(s=="ADD") h[i]=h[i-1]+a;
		if(s=="SUB") h[i]=h[i-1]-a;
		if(s=="SET") h[i]=a;
		if(s=="BACK")h[i]=h[i-a-1];
		cout<<h[i]<<endl;
	}
}//T了,是我想的太简单了咩??
2020/10/31 23:43
加载中...