#CF2232D. 魔法多层蛋糕

魔法多层蛋糕

题目描述

Alice 做好了一个有 nn 层的魔法多层蛋糕。层编号从小到大为 1,2,,n1,2,\ldots,n,第 11 层最小,第 nn 层最大。现在需要把蛋糕从厨房运到派对现场。由于不能一次搬完整个蛋糕,Alice 还准备了一个仓库作为中转。

蛋糕有魔法:第 ii 层蛋糕当且仅当它上方恰好有 aia_i 层蛋糕时可以被移动。

每次移动中,你可以从任意地点选择一层当前可移动的蛋糕,把它移动到另一个地点的一摞蛋糕顶部。如果目标地点已有蛋糕,为了保持结构,移动过去的层必须放在一层严格比它大的蛋糕上方。

共有三个地点:11 表示厨房,22 表示仓库,33 表示派对现场。一开始所有层都在地点 11,目标是把所有层移动到地点 33

请在不超过 2n2^n 次移动内完成,或报告无解。

输入格式

第一行包含一个整数 tt,表示测试组数。

每组测试数据第一行包含一个整数 nn

第二行包含 nn 个整数 a1,a2,,ana_1,a_2,\ldots,a_n

输出格式

对于每组测试数据,若无解,输出 NO

否则先输出 YES,下一行输出移动次数 kk,满足 0k2n0\le k\le 2^n

接下来 kk 行,每行输出三个整数 id,from,toid,from,to,表示把第 idid 层从地点 fromfrom 移动到地点 toto

数据范围

  • 1t100001 \le t \le 10000
  • 1n201 \le n \le 20
  • 0ain0 \le a_i \le n
  • 所有测试数据的 2n2^n 之和不超过 2202^{20}
3
3
0 0 0
3
0 1 2
3
2 2 2
YES
7
1 1 3
2 1 2
1 3 2
3 1 3
1 2 1
2 2 3
1 1 3
YES
3
3 1 3
2 1 3
1 1 3
NO

提示

下方动图展示了测试用例 1122 的解决方案可视化:

在第三个测试用例中,可以证明无法将蛋糕的所有层移动到派对地点。

来源

Codeforces Round 2232 D - Magical Tiered Cake