A93509.排列轮转排序

提高+/省选-

官方

通过率:0%

时间限制:1.00s

内存限制:128MB

题目描述

给定一个长度为 nn 的排列 aa。我们称下标 ii 是“好”的,如果满足 ai=ia_i=i

每经过 11 秒钟,我们将所有不是“好”的下标对应的元素整体向右轮转一位。具体来说:

  • s1,s2,,sks_1,s_2,\dots,s_k 是所有不是“好”的下标,按从小到大排列;
  • 对于每个 ii11kk,同时执行 as(imodk)+1:=asia_{s_{(i\bmod k)+1}} := a_{s_i}。(也就是这些位置的值整体右移一格)

请你对每个 ii1in1\le i\le n),求出下标 ii 第一次变为“好”(即第一次出现 ai=ia_i=i)的时刻(从 00 秒开始计时)。

排列:由 11nnnn 个互不相同的整数组成的数组。

输入格式

第一行一个整数 tt1t1041\le t\le 10^4),表示测试用例数量。

每个测试用例:

  • 第一行一个整数 nn1n1061\le n\le 10^6
  • 第二行 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n,表示一个排列(1ain1\le a_i\le n

保证所有测试用例中 nn 的总和不超过 10610^6

输出格式

对每个测试用例,输出一行 nn 个整数,第 ii 个整数表示下标 ii 第一次变为“好”的时刻。

说明/提示

样例解释

  • 第一个用例里,2255 一开始就满足 a2=2,a5=5a_2=2,a_5=5,所以它们答案是 00;其余位置在第 11 秒一起轮转后都变好。
  • 第二个用例里,55 一开始就是好下标;之后每秒对“不好”的下标集合轮转,分别在第 11 秒、第 22 秒让更多位置变好。
首页