#jSDPlydlt50x5C04. 装饰围栏 A Decorative Fence

装饰围栏 A Decorative Fence

好的,我将这个题目整理成适合算法平台的形式,包含题目描述、输入输出格式、样例及详细解释。


题目描述

NN 块木板,长度分别为 1,2,,N1, 2, \dots, N,宽度均为 11
现要用这些木板拼成一个宽度为 NN 的围栏,使得围栏中相邻的木板高低交错,即每块木板两侧的木板要么都比它高,要么都比它低。

对于围栏中的一块木板:

  • 如果两侧的木板都比它低,则称它处于高位
  • 如果两侧的木板都比它高,则称它处于低位
  • 对于左右两端的木板,只需考虑它唯一的一侧。

将所有满足条件的围栏方案,按字典序排序(按照木板长度从左到右构成的序列排序)。
现在给定整数 CC,求排名为 CC(从 11 开始计数)的围栏序列是什么。

输入格式

第一行一个整数 KK,表示数据组数。
接下来 KK 行,每行两个整数 N,CN, C

输出格式

每组数据输出一行,表示排名为 CC 的围栏序列,木板长度用空格隔开。

数据范围

  • 1N201 \le N \le 20
  • 0<C<2630 < C < 2^{63}

保证 CC 不超过合法围栏的总数。

输入样例

2
2 1
3 3

输出样例

1 2
2 3 1

样例解释

N=2N = 2 的情况

所有可能的围栏(满足高低交错):

  1. 1 2:第一块木板 1 在低位(右侧 2 比它高),第二块木板 2 在高位(左侧 1 比它低)。
  2. 2 1:第一块木板 2 在高位(右侧 1 比它低),第二块木板 1 在低位(左侧 2 比它高)。

按字典序排序:

  1. 1 2
  2. 2 1

排名第 1 的序列是 1 2,所以输出 1 2


N=3N = 3 的情况

所有合法围栏(按字典序排列):

  1. 1 3 2
  2. 2 1 3
  3. 2 3 1
  4. 3 1 2
  5. 3 2 1

排名第 3 的序列是 2 3 1,所以输出 2 3 1


思路提示(不要求输出)

此类问题属于带限制条件的排列计数与排名计算,可以用动态规划预处理:

  • dp[n][j][0/1]dp[n][j][0/1] 表示用 nn 个不同的木板(长度 1 到 nn),第一块木板在剩余木板中按高度排名第 jj 位(即从小到大第 jj 小),且第一块木板处于低位(0)或高位(1)时的方案数。
  • 利用递推关系可以由小规模推到大规模,然后从高位到低位确定每块木板。