CF234H Merging Two Decks

题目描述

你面前的桌子上放着两副牌,其中有些牌面朝上,有些牌面朝下。你想把它们合并成一副牌,并且每张牌都面朝下。你将分两个阶段进行。 第一阶段是合并两副牌,使同一副牌的相对的顺序不变。也就是说,对于一副牌中的任意两张不同的牌 $i$ 和 $j$,如果牌 $i$ 位于牌 $j$ 之上,则在合并之后,牌 $i$ 也必须位于牌 $j$ 之上。 第二阶段是在第一阶段的基础上进行的。在阶段中,你可以拿几张最上面的牌,把它们全部转回来。因此,每一张被拿走的牌都被翻转,并且这些牌的顺序被颠倒。也就是说,在颠倒前位于底部的牌,在颠倒后将位于顶部。 你的任务是确保所有的牌都面朝下。在第一阶段找到合并牌的顺序,在第二阶段找到翻转操作的顺序,使所有牌面朝下,并且翻转次数最小。

输入格式

第一个输入行包含一个整数$n——$第一副牌组中的牌数$(1

输出格式

在第一行中,打印$n+m$空格分隔的整数,即第一阶段后卡片的编号。从上到下列出卡片。第一副牌中的牌应该按照从上到下的顺序,从$1$到$n$匹配它们的索引。第二副牌中的牌应该与其索引相匹配,按从上到下的顺序增加$n$,即从$n+1$到$n+m$的数字。 在第二行中,打印一个整数$x$,这是使牌组中的所有牌面朝下所需的最小回合数。在第三行打印$x$整数:$c_{1},c_{2}......c^{x}$$(1\le c_{i}\le n+m)$,它们中的每一个都表示要从牌组顶部取出以执行转弯操作的牌的数量。按应执行的顺序打印操作。 如果有多个最佳解决方案,请打印其中任何一个。保证最低操作次数不超过$6\times10^{5}$。