QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 512 MB Total points: 100

#13034. 编辑器

Statistics

Byteasar 是一名程序员,他正在开发一款革命性的文本编辑器。该编辑器有两种操作:一种用于编辑文本,另一种用于撤销之前执行的操作。该编辑器的一项创新功能是多级撤销操作。其工作原理如下:

我们将文本编辑操作称为 0 级操作。$i$ 级撤销操作($i = 1, 2, \dots$)会撤销最近执行的且尚未被撤销的级别小于 $i$ 的操作。例如,1 级撤销操作只能撤销编辑操作,而 2 级撤销操作既可以撤销编辑操作,也可以撤销 1 级撤销操作(但不能撤销更高级别的撤销操作)。

更正式地说,每个已执行的操作都处于两种状态之一:激活(active)或撤销(undone)。设 $X$ 为其中一个操作。在执行操作 $X$ 后,它处于激活状态。如果 $X$ 是一个 $i$ 级撤销操作,我们找到最近的处于激活状态且级别小于 $i$ 的操作(记为 $X_1$),并将 $X_1$ 的状态更改为撤销。如果 $X_1$ 也是一个撤销操作,我们必须将 $X_1$ 原本撤销的操作(设为 $X_2$)的状态更改为激活。我们以同样的方式继续:每当一个之前撤销了某个操作 $X_{j+1}$ 的撤销操作 $X_j$ 的状态发生改变时,我们也必须改变 $X_{j+1}$ 的状态(这当然可能导致后续操作的状态发生改变)。整个状态修改链在到达一个编辑操作时结束。

为简单起见,编辑器中当前的文本内容由一个整数 $s$ 指定,称为编辑器状态(初始为 0)。每个编辑操作都指定了它所产生的编辑器状态。编辑器状态取决于处于激活状态的最后一个编辑操作。请帮助 Byteasar 编写一个程序来跟踪编辑器状态。

让我们看看实际效果:下表显示了 Byteasar 执行的一些操作以及执行每个操作后的编辑器状态。符号 $E_s$ 表示将编辑器状态更改为 $s$ 的编辑操作,而符号 $U_i$ 表示 $i$ 级撤销操作。

操作 $E_1$ $E_2$ $E_5$ $U_1$ $U_1$ $U_3$ $E_4$ $U_2$ $U_1$ $U_1$ $E_1$
编辑器状态 0 1 2 5 2 1 2 4 2 1 0 1

首先,Byteasar 执行了三个编辑操作。编辑器状态从 0 变为 1,然后变为 2,最后变为 5。接下来,他执行了两个 1 级撤销操作,撤销了操作 $E_5$ 和 $E_2$(将它们的状态更改为撤销)。因此,编辑器状态恢复为 1。随后的 3 级撤销操作撤销了最后一个操作 $U_1$(将其状态更改为撤销),从而恢复了操作 $E_2$(将其状态改回激活)。结果,编辑器状态再次变为 2。操作 $U_2$ 撤销了操作 $E_4$,操作 $U_1$ 再次撤销了已恢复的操作 $E_2$,最后一个操作 $U_1$ 撤销了操作 $E_1$,最终操作为 $E_1$。

输入格式

输入的第一行包含一个正整数 $n$,表示 Byteasar 执行的操作数量。接下来的 $n$ 行包含操作描述,每行一个整数 $a_i$($-n \le a_i \le n, a_i \neq 0$)。如果 $a_i > 0$,则表示一个将编辑器状态修改为 $a_i$ 的编辑操作。如果 $a_i < 0$,则表示一个级别为 $-a_i$ 的撤销操作。你可以假设对于每一个撤销操作,总会有某个级别更小的处于激活状态的操作可以被撤销。

输出格式

你的程序应输出 $n$ 行。第 $i$ 行应包含一个整数,表示执行输入中的前 $i$ 个操作后的编辑器状态。

样例

输入格式 1

11
1
2
5
-1
-1
-3
4
-2
-1
-1
1

输出格式 1

1
2
5
2
1
2
4
2
1
0
1

子任务

子任务 数据范围 分值
1 $n \le 5000$ 20
2 $n \le 300\,000$ 且仅包含操作 $E_i$ 和 $U_1$ 15
3 $n \le 300\,000$ 且仅对序列中的最后一个数字进行评分(但前 $n-1$ 个数字必须是 $0$ 到 $n$ 之间的整数) 28
4 $n \le 300\,000$ 37

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.