#P3460. [POI2007] TET-Tetris Attack

[POI2007] TET-Tetris Attack

题目描述

一种名为 Tetris Attack 的猜谜游戏风靡 Byteotia。游戏本身非常复杂,因此我们只介绍它的简化规则:

玩家拥有一个有 2n2n 个元素的栈,一个元素放置在另一个元素上,这样一个组合有 nn 个不同的符号标记。对于每个符号,栈中恰好有两个元素用一个符号标记。

玩家可以交换两个相邻元素,即互换他们的位置。交换后,如果有两个相邻的元素标有相同的符号,则将他们都从栈中删除。然后,位于其上方的所有元素都会掉落下来,并且可以造成再次删除。

玩家的目标是以最少的移动次数清空堆栈。请你编写一个程序,找出最少的移动次数及方案。

输入格式

第一行一个整数 nn

接下来的 2n2n 行里给出了栈的初始内容,第 i+1i+1 行包含一个整数 aia_i1ain1 \leq a_i \leq n ),表示从底部数起第 ii 个元素所标记的符号(每个符号都在栈中出现正好两次)。

最初不存在相邻的两个元素符号相同的情况,保证有不超过 10610^6 次操作的方案。

输出格式

第一行一个整数 mm ,表示最小的移动次数。

接下来 mm 行,每行输出一个数。

i+1i + 1 行输出 pip_i,即表示玩家在第 ii 步时选择交换 pip_ipi+1p_{i+1}

如果存在多个方案,则输出其中任何一个。

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

提示

1n500001 \le n \le 50000