P15345 [TOIP 2025] 连序

题目描述

一个非负整数的二进制表示可视为一 $01$ 字符串,左边为高位(most significant bit),右边为低位(least significant bit);若最多有 $k$ 个连续的位为 $1$,则称该数字的「连序」为 $k$。今给定 $n$ 个非负整数,请依它们的「连序」由小到大排序;若两数字的连序相同,则先输出数值较小的。 举例来说,$7$、$12$、$27$ 的二进制表示分别为 ${\left(111\right)}_2$、${\left(1100\right)}_2$、${\left(11011\right)}_2$,可知三数的连序分别为 $3$、$2$、$2$,其中 $12$ 与 $27$ 的连序相同,但 $12 < 27$,故需依次输出 $12$、$27$、$7$。

输入格式

$$ \begin{aligned} &n \\ &a_1 \; a_2 \; a_3 \; \cdots \; a_n \end{aligned} $$ * $n$ 代表要排序的数字个数。 * $a_i$ 代表第 $i$ 个要排序的数字。

输出格式

$$ \begin{aligned} &s_1 \; s_2 \; s_3 \; \cdots \; s_n \end{aligned} $$ * $s_i$ 代表按照题目要求排序后的第 $i$ 个数字。

说明/提示

### 数据限制 * $1 \le n \le 2 \times {10}^5$。 * $0 \le a_i < 2^{30}$。 * 所有输入的数皆为整数。 ### 评分说明 本题共有四组子任务,条件限制如下所示。每一组可有一或多笔测试数据,该组所有测试数据皆需答对才会获得该组分数。 | 子任务 | 分数 | 额外输入限制 | | :------: | :----: | ------------ | | 1 | 22 | $n \le 2,\ a_i < 16$。 | | 2 | 22 | $n \le 2\,000,\ a_i < 2^{16}$。 | | 3 | 26 | $a_i < 2^{16}$。 | | 4 | 30 | 无额外限制。 |