#P4732. [BalticOI 2015] Editor
[BalticOI 2015] Editor
Description
Byteasar 是一名程序员,他正在开发一个革命性的文本编辑器。在这个编辑器中,有两种类型的操作:一种是允许在编辑器中编辑文本的操作,另一种是允许撤销先前执行的操作的操作。这个编辑器的一个创新功能是多级撤销操作。其工作原理如下。
我们说文本编辑操作是一个 0 级操作。一个 i 级的撤销操作(对于 )可以撤销最后一个未被撤销的、级别不超过 的操作。例如,一个 1 级的撤销操作只能撤销编辑操作,而一个 2 级的撤销操作可以撤销编辑操作以及 1 级的撤销操作(但不能撤销更高级别的撤销操作)。
更正式地说,已经执行的每个操作可以处于两种状态:活动或已撤销。设 是其中一个操作。刚执行完操作 后,它处于活动状态。如果 是一个 i 级的撤销操作,我们找到最近的、处于活动状态的、级别不超过 的操作(记为 ),并将操作 的状态更改为已撤销。如果 也是一个撤销操作,我们必须将 撤销的操作(记为 )的状态更改为活动。我们以相同的方式继续:每当一个撤销操作 的状态改变时,我们必须也改变 的状态(当然,这可能导致进一步操作的状态改变)。
当达到一个编辑操作时,整个状态修改链结束。
为简单起见,编辑器中的当前文本内容将由一个称为编辑器状态的单一整数 指定(初始为 )。每个编辑操作指定它产生的编辑器状态。
编辑器状态取决于处于活动状态的最后一个编辑操作。帮助 Byteasar 编写一个程序来跟踪编辑器状态。
让我们看看这个功能的实际应用:下表显示了 Byteasar 执行的一些操作以及每次执行后的编辑器状态。符号 表示将编辑器状态更改为 的编辑操作,而符号 表示 i 级的撤销操作。
| Operation | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Editor state | 0 | 1 | 2 | 5 | 2 | 1 | 2 | 4 | 2 | 1 | 0 | 1 |
首先,Byteasar 执行了三个编辑操作。编辑器状态从 变为 ,然后变为 ,最后变为 。接下来,他执行了两个 1 级的撤销操作,撤销了操作 和 (将它们的状态更改为已撤销)。因此,编辑器状态恢复为 。接下来的 3 级撤销操作撤销了最后一个 操作(将其状态更改为已撤销),从而恢复了操作 (将其状态改回活动)。结果,编辑器状态再次变为 。操作 撤销了操作 ,操作 再次撤销了恢复的操作 ,最后一个操作 撤销了操作 ,最后的操作是 。
Input Format
输入的第一行包含一个正整数 ,指定 Byteasar 执行的操作数。接下来的 行包含操作的描述,每行一个整数 。如果 ,则它指定一个将编辑器状态修改为 的编辑操作。如果 ,则它指定一个级别为 的撤销操作。你可以假设对于每个撤销操作,都会有一些较低级别的活动状态的操作可以被撤销。
Output Format
你的程序应输出 行。第 行应包含一个整数,指定执行输入中的前 个操作后的编辑器状态。
11
1
2
5
-1
-1
-3
4
-2
-1
-1
1
1
2
5
2
1
2
4
2
1
0
1
Hint
以下子任务和评测无关,仅供参考。

(但是我开不了 4 个 Subtask,所以就放在一起测了。)
题面翻译由 ChatGPT-4o 提供。
京公网安备 11011102002149号