#HK5272. 「UOI 2019 Stage 4 Day1」二进制操作

「UOI 2019 Stage 4 Day1」二进制操作

题目描述

题目译自 Ukrainian Olympiads in Informatics 2019 Stage 4 Day1 T1. Двійкові маніпуляції

科扎克·武斯在信息学课程中总是遇到「二」的问题……不,不是因为他不擅长计算机。而是最近所有的作业都必须在一个特别喜欢 22 的幂的自动机上完成。

22 的幂是指形如 2x2^x 的数字,其中 xx 是一个非负整数。例如,1,2,4,8,161, 2, 4, 8, 1622 的幂,而 3,7,10,15,193, 7, 10, 15, 19 则不是。

自动机操作一个长度为 nn 的整数数组 aa,其中 nn22 的幂。自动机唯一能做的操作是将第 tt 个位置的数字移动到数组的开头,同时将从开头到该位置的所有数字向后移动一位。例如,如果 a=[1,2,3,4,5,6,7,8]a = [1, 2, 3, 4, 5, 6, 7, 8],将第 44 个元素移动到开头后,数组变为 a=[4,1,2,3,5,6,7,8]a = [4, 1, 2, 3, 5, 6, 7, 8]。请注意,自动机只能对 tt22 的幂的位置执行此操作。

武斯正全力完成他的最后一份家庭作业——对于给定的数组,编写一个序列 t1,t2,,tkt_1, t_2, \ldots, t_k,将数组转换为非递减排序的数组。他已经取得了一些进展,但他请求你也完成同样的任务,以便核对答案。请帮助他找到这样的序列!

输入格式

第一行包含两个整数 nngg (2n128,0g6)(2 \leq n \leq 128, 0 \leq g \leq 6),分别表示数组长度和子任务编号。保证 nn22 的幂。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \ldots, a_n (1ain)(1 \leq a_i \leq n),表示数组的元素。

输出格式

第一行输出一个整数 kk (0k16384)(0 \leq k \leq 16384),表示命令的数量。

第二行输出 kk 个整数 t1,t2,,tkt_1, t_2, \ldots, t_k (1tin)(1 \leq t_i \leq n),表示排序数组的命令序列。这样的序列可能有多个,因此输出任意一个(不必是最短的)。

4 0
4 3 2 1

4
2 4 4 2

在第一个样例中,数组初始为 [4,3,2,1][4, 3, 2, 1]。将第 22 个元素移动到开头后,数组变为 [3,4,2,1][3, 4, 2, 1]。然后两次将最后一个元素移动到开头,第一次得到 [1,3,4,2][1, 3, 4, 2],第二次得到 [2,1,3,4][2, 1, 3, 4]。最后一步将第 22 个元素移动到开头,得到 [1,2,3,4][1, 2, 3, 4],这是一个非递减排序的数组。

4 0
1 3 1 2

8
2 4 2 2 4 4 2 2

在第二个样例中,数组初始为 [1,3,1,2][1, 3, 1, 2]。将第 44 个元素移动到开头后,数组变为 [2,1,3,1][2, 1, 3, 1]。然后将第 22 个元素移动到开头,得到 [1,2,3,1][1, 2, 3, 1]。最后将最后一个元素移动到开头,得到 [1,1,3,2][1, 1, 3, 2],这是一个有序数组。

数据范围与提示

详细子任务附加限制及分值如下表所示:

子任务 分值 附加限制
11 1111 n=2n = 2;所有数字不同
22 1515 n=4n = 4;所有数字不同
33 2020 n=8n = 8;所有数字不同
44 2222 数组中恰好有 n2\frac{n}{2} 个数字为 11,其余为 22
55 2323 所有数字不同
66 99 无附加限制