首页 > 试题广场 >

奶牛排排站

[编程题]奶牛排排站
  • 热度指数:958 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}编号为 1NN 头奶牛正在和农夫约翰玩一个疯狂游戏。奶牛们将自己排列成一行,并询问农夫约翰它们的排列编号是多少。此外,农夫约翰也可以给奶牛们一个排列编号,奶牛们必须重新排列成那个对应编号的排列。

\hspace{15pt}一个排列的编号指的是,考虑这个排列的全部可能排列,这个排列在全部可能排列中的字典序排名。 

\hspace{15pt}农夫约翰和奶牛们希望你能帮助他们玩这个游戏。他们有 K 个查询需要帮助。查询 i 有两个部分:C_i 是命令,可以是 `P` 或 `Q` 。

\hspace{15pt}如果 C_i 是 `P` ,那么查询的第二部分将是一个整数 A_i,这是一个排列编号。这是农夫约翰挑战奶牛们排成正确的奶牛排列。

\hspace{15pt}如果 C_i 是 `Q`,那么查询的第二部分将是 N 个不同的整数 B_{i,j}。这将表示一个奶牛排列。这是奶牛们挑战农夫约翰找出它们的排列编号。

输入描述:
\hspace{15pt}输入的第 1 行两个用空格分隔的整数 N,K \left( 1 \leqq N \leqq 20, 1 \leqq K \leqq 10^4\right),分别表示奶牛的数量和询问的数量。
\hspace{15pt}接下来 2 \cdot K 行,每两行共同构成一次询问。每次询问的第一行有一个字符 op \left( op \in \{P,Q\} \right) 代表询问类型,随后:
\hspace{22.5pt}\bullet\若 op= \texttt{`P'} ,在下一行输入一个整数 A_i\left(1 \leqq A_i \leqq N ! \right),表示奶牛需要排列成的顺序的编号;
\hspace{22.5pt}\bullet\若 op=\texttt{`Q'} ,在下一行输入一行 N 个用空格分隔的整数 B_{i,j} \left(1 \leqq B_{i,j} \leqq N \right),表示此时奶牛的排列顺序。


输出描述:
\hspace{15pt}输出包含 K 行,依次分别为各个询问的结果:
\hspace{22.5pt}\bullet\对于 \texttt{`P'} 操作,输出一行 N 个用空格分隔的整数,表示对应编号的奶牛排列顺序。
\hspace{22.5pt}\bullet\对于 \texttt{`Q'} 操作,输出一行一个整数,表示对应奶牛排列顺序的排序编号。
示例1

输入

5 2
P
3
Q
1 2 5 3 4

输出

1 2 4 3 5
5

说明

农夫约翰有 5 头奶牛,并希望它们按照排列编号 3 来进行排列。

按升序字典序排列的排列:

第 1 个:1,2,3,4,5

第 2 个:1,2,3,5,4

第 3 个:1,2,4,3,5

因此,奶牛们将自己排列成奶牛排列 1,2,4,3,5

假如奶牛们反过来排列成配置「1,2,5,3,4」,并询问农夫约翰它们此时的排列编号是多少。此时我们可以继续列表:

第 4 个:1,2,4,5,3

第 5 个:1,2,5,3,4

此时第 5 个编号对应的排列与奶牛的排列一一对应上了,所有农夫约翰可以看到答案是 5 。

这道题你会答吗?花几分钟告诉大家答案吧!