#P15346. [TOIP 2025] 煎餅攤

[TOIP 2025] 煎餅攤

说明

阿麦在假日市集里摆了一个摊子卖煎饼。 考量每个人的食量不同,他决定贩售 nn 种不同大小的煎饼,依照小到大由 11 编号到 nn,并预计将同一种大小的煎饼堆成一叠方便选购。 每叠煎饼至多只能叠 mm 片,否则会因为过高而倒塌。 阿麦每煎好一片就将该片煎饼放到摊位台面上,但因为太过匆忙,不同大小的煎饼被堆放在同一叠。 当他注意到时,摊位上已有 nn 叠煎饼,每叠都恰有 mm 片,而每种大小的煎饼也恰有 mm 片。

阿麦想利用煎饼铲来移动这些煎饼,调整回他预期的摆设。 他只能通过下面的动作来调整煎饼位置:

  • 将煎饼铲插入某叠煎饼中的某两片之间
  • 将煎饼铲上方所有的煎饼放置至另一叠的上方 (铲子上方的煎饼顺序不变)

因摊位台面大小有限,除了既有的 nn 叠煎饼外,剩余的空间仅能再容纳一叠煎饼; 此外,调整过程不可有任一叠超过 mm 片,否则该叠煎饼就会倒塌。 请协助阿麦将同样大小的煎饼调整为同一叠,并且让较小的煎饼排在较左边。 举例来说,若 n=2n=2m=3m=3,一开始的 22 叠煎饼如下图 (最右边为台面剩余空间):

:::align{center} :::

一个可能的调整方式如下,将煎饼铲插入最左边的下面两片之间,并移动至右方的剩余空间:

:::align{center} :::

将煎饼铲插入中间的下面两片之间,并移动至最左边:

:::align{center} :::

将最左边最上面的煎饼铲至中间:

:::align{center} :::

接着再将最右边的两个煎饼分别铲到第 11, 22 叠,便完成了阿麦预期的摆设方式:

:::align{center} :::

请写一个程序帮助阿麦将各种大小的煎饼移动到想要的位置, 由于移动方法很多可以输出任何一种可行的移动方法, 但移动的次数需要在 9nm9nm 次以内。

输入格式

$$\begin{aligned} &m \; n \\ &a_{1,1} \; a_{1,2} \; \cdots \; a_{1,m} \\ &a_{2,1} \; a_{2,2} \; \cdots \; a_{2,m} \\ &\vdots \\ &a_{n,1} \; a_{n,2} \; \cdots \; a_{n,m} \end{aligned}$$
  • nn 代表目前共有 nn 叠煎饼。
  • mm 代表目前每叠煎饼恰有 mm 片煎饼,并且每种大小的煎饼都恰有 mm 片。
  • ai,ja_{i,j} 代表由左到右第 ii 叠,由下至上第 jj 个煎饼的大小。

输出格式

$$\begin{aligned} &c \\ &s_1 \; k_1 \; t_1 \\ &s_2 \; k_2 \; t_2 \\ &\vdots \\ &s_c \; k_c \; t_c \end{aligned}$$
  • cc 代表移动的总次数。
  • sis_i, kik_i, tit_i 代表第 ii 次的移动将从左到右第 sis_i 的上面 kik_i 片煎饼移动到从左到右的第 tit_i 叠。(第 n+1n+1 叠为开始时的空位)
  • 0c9nm0 \le c \le 9nm
  • 1si,tin+11 \le s_i, t_i \le n+1,且 sitis_i \neq t_i
  • ki1k_i \ge 1 且不得大于当前第 sis_i 叠的煎饼数量。
3 2
1 2 1
2 1 2
5
1 2 3
2 2 1
1 1 2
3 1 1
3 1 2

提示

数据限制

  • 1n501 \le n \le 50
  • 1m501 \le m \le 50
  • 1ai,jn1 \le a_{i,j} \le n
  • 所有输入的数皆为整数。
  • 保证 11nn 每个数字恰好在 aa 里出现 mm 次。

评分说明

本题共有三组子任务,条件限制如下所示。每一组可有一或多笔测试数据,该组分数为所有测试数据的最小得分。

子任务 分数 额外输入限制
1 8 m=1m = 1
2 37 n=2n = 2
3 55 无额外限制。

本题若输出任意合法解答该测试数据以满分计,但输出若有下列非法情况测试数据则以 00 分计:

  • 输出的移动次数过多。
  • 数字超出范围。
  • 移动的煎饼数量大于起始叠的煎饼数量。
  • 移动完毕后,第 ii 种煎饼没有全部都在第 ii 叠的位置上。

另外,如果移动过程中有任一叠煎饼超过 mm 个,则该笔测试数据以原测试数据组分数 30%30\% 计。