A93509.排列轮转排序
提高+/省选-
官方
通过率:0%
时间限制:1.00s
内存限制:128MB
题目描述
给定一个长度为 n 的排列 a。我们称下标 i 是“好”的,如果满足 ai=i。
每经过 1 秒钟,我们将所有不是“好”的下标对应的元素整体向右轮转一位。具体来说:
- 设 s1,s2,…,sk 是所有不是“好”的下标,按从小到大排列;
- 对于每个 i 从 1 到 k,同时执行 as(imodk)+1:=asi。(也就是这些位置的值整体右移一格)
请你对每个 i(1≤i≤n),求出下标 i 第一次变为“好”(即第一次出现 ai=i)的时刻(从 0 秒开始计时)。
排列:由 1 到 n 的 n 个互不相同的整数组成的数组。
输入格式
第一行一个整数 t(1≤t≤104),表示测试用例数量。
每个测试用例:
- 第一行一个整数 n(1≤n≤106)
- 第二行 n 个整数 a1,a2,…,an,表示一个排列(1≤ai≤n)
保证所有测试用例中 n 的总和不超过 106。
输出格式
对每个测试用例,输出一行 n 个整数,第 i 个整数表示下标 i 第一次变为“好”的时刻。
说明/提示
样例解释
- 第一个用例里,2 和 5 一开始就满足 a2=2,a5=5,所以它们答案是 0;其余位置在第 1 秒一起轮转后都变好。
- 第二个用例里,5 一开始就是好下标;之后每秒对“不好”的下标集合轮转,分别在第 1 秒、第 2 秒让更多位置变好。