CF1896E.Permutation Sorting
提高+/省选-
通过率:0%
时间限制:4.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
You are given a permutation† a of size n. We call an index i good if ai=i is satisfied. After each second, we rotate all indices that are not good to the right by one position. Formally,
- Let s1,s2,…,sk be the indices of a that are not good in increasing order. That is, sj<sj+1 and if index i is not good, then there exists j such that sj=i.
- For each i from 1 to k, we assign as(i%k+1):=asi all at once.
For each i from 1 to n, find the first time that index i becomes good.
† A permutation is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation (2 appears twice in the array) and [1,3,4] is also not a permutation (n=3 but there is 4 in the array).
给你一个长度为 n 的排列† a。我们称下标 i 是“好的”,当且仅当满足 ai=i。每过一秒,我们将所有“不好的”下标整体向右循环移动一位。形式化地定义如下:
- 设 s1,s2,…,sk 是数组 a 中所有“不好的”下标,按升序排列。即对所有 j 满足 sj<sj+1,且若下标 i 不好,则存在某个 j 使得 sj=i。
- 对每个 i 从 1 到 k,同时执行赋值操作:as(imodk+1):=asi。
对每个 i(从 1 到 n),求下标 i 首次变为“好”的时刻(以秒为单位)。
† 排列是指由 1 到 n 这 n 个互不相同的整数以任意顺序组成的数组。例如,[2,3,1,5,4] 是一个排列;而 [1,2,2] 不是排列(数字 2 出现了两次),[1,3,4] 也不是排列(此时 n=3,但数组中出现了 4)。
输入格式
Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤104). The description of the test cases follows.
The first line of each test case contains a single integer n (1≤n≤106) — the size of permutation a.
The second line of each test case contains n integers a1,a2,…,an (1≤ai≤n) — the elements of permutation a.
It is guaranteed that the sum of n over all test cases does not exceed 106.
每个测试包含多个测试用例。第一行包含测试用例的数量 t(1≤t≤104)。随后是各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤106)—— 排列 a 的大小。
每个测试用例的第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n)—— 排列 a 的元素。
保证所有测试用例的 n 之和不超过 106。
输出格式
For each test case, output a single line containing n integers where the i-th integer represents the first time that index i becomes good.
对于每个测试用例,输出一行包含 n 个整数,其中第 i 个整数表示下标 i 首次变为“好”的时刻。
输入输出样例
输入#1
2 5 3 2 4 1 5 6 2 1 4 6 5 3
输出#1
1 0 1 1 0 2 1 2 1 0 1
说明/提示
In the first test case, 2 and 5 are already in the correct position so indices 2 and 5 become good at 0 second. After 1 second, a cyclic shift will be done with s=[1,3,4], resulting in array a=[1,2,3,4,5]. Notice that indices 1, 3 and 4 become good at 1 second.
In the second test case, 5 is already in the correct position, so index 5 becomes good at 0 second. After 1 second, a cyclic shift will be done with s=[1,2,3,4,6], resulting in array a=[3,2,1,4,5,6]. Notice that indices 2, 4 and 6 become good at 1 second. After 2 seconds, a cyclic shift will be done with s=[1,3], resulting in array a=[1,2,3,4,5,6]. Notice that indices 1 and 3 become good at 2 second.
在第一个测试用例中,2 和 5 已处于正确位置,因此下标 2 和 5 在 0 秒时即变为“好下标”。经过 1 秒后,将对子数组 s=[1,3,4] 执行循环移位操作,得到数组 a=[1,2,3,4,5]。注意,下标 1、3 和 4 在 1 秒时变为“好下标”。
在第二个测试用例中,5 已处于正确位置,因此下标 5 在 0 秒时即变为“好下标”。经过 1 秒后,将对子数组 s=[1,2,3,4,6] 执行循环移位操作,得到数组 a=[3,2,1,4,5,6]。注意,下标 2、4 和 6 在 1 秒时变为“好下标”。经过 2 秒后,将对子数组 s=[1,3] 执行循环移位操作,得到数组 a=[1,2,3,4,5,6]。注意,下标 1 和 3 在 2 秒时变为“好下标”。
输入解题思路,AI测评打分。不知道怎么写?