CF875B Sorting the Coins
题目描述
最近,Dima 在一家集邮店遇见了 Sasha,从那以后他们便一起收集硬币。他们最喜欢做的事就是整理硬币收藏。Sasha 喜欢井然有序的东西,因此他希望自己的硬币排成一排时,先是所有已经退出流通的硬币,再是所有仍在流通中的硬币。
为此,Dima 使用以下算法进行整理。他的每一步操作如下:
1. 他从左到右遍历所有硬币;
2. 如果发现第 $i$ 枚硬币仍在流通,而第 $(i+1)$ 枚硬币已经退出流通,他就交换这两枚硬币,然后从第 $(i+1)$ 枚硬币继续观察后面的硬币。
Dima 重复上述过程,直到在一次遍历中没有发生任何交换为止。Dima 将对序列进行排序所需的遍历次数称为“排序难度”,即他从头到尾遍历硬币的次数。例如,如果一开始序列已排好序,则排序难度为 $1$。
今天 Sasha 邀请 Dima 玩一个游戏。首先,Sasha 依次摆放 $n$ 枚已经退出流通的硬币成一排。接着,Sasha 每次从中选择一枚已经退出流通的硬币,换成一枚仍在流通的硬币,这一过程连续进行 $n$ 次。在这期间,Sasha 不断询问 Dima 当前序列的排序难度。
难点在于,Dima 不能实际触碰硬币,只能在脑中判断排序难度。请帮助 Dima 完成这个任务。
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 300000$),表示 Sasha 摆放在 Dima 面前的硬币数量。
第二行包含 $n$ 个不同的整数 $p_{1}, p_{2}, ..., p_{n}$($1 \leq p_{i} \leq n$),表示 Sasha 每次把第 $p_{i}$ 个位置的硬币替换为仍在流通的硬币。硬币的位置编号从左到右依次为 $1$ 到 $n$。
输出格式
输出 $n+1$ 个整数 $a_{0}, a_{1}, ..., a_{n}$,其中 $a_{0}$ 表示初始状态下的排序难度,$a_{1}$ 表示第一次替换后的排序难度,依此类推。
说明/提示
我们用 O 表示已经退出流通的硬币,X 表示仍在流通的硬币。
在第一个样例中,最初所有硬币都是 O,因此 Dima 从左到右遍历一遍,没有需要交换的硬币。
第一次替换后,Dima 将第一枚硬币换成 X,随后该 X 会向右连续移动三次,最终状态:
XOOO $ \to $ OOOX
替换第三枚硬币后,Dima 的操作如下:
XOXO $ \to $ OXOX $ \to $ OOXX
替换第四枚硬币后:
XOXX $ \to $ OXXX
最后,替换第二枚硬币后,所有硬币都是 X,Dima 只需遍历一次,不再有交换。
由 ChatGPT 5 翻译