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 | 无额外限制。 |