CF-1030-B. Make It Permutation · znzryb
## 思路讲解
行上面反转,使列上面为排列。
注意到,可以对称的操作,反转1,i,使得 i 为首,再反转N-i+1,N,
```cpp
// 第一阶段操作
// 对行 i = 1 到 n-1, 翻转子数组 [i, n]
for (int i = 1; i < n; ++i) {
std::cout << i << " " << i << " " << n << std::endl;
}
// 第二阶段操作
// 对行 j = 2 到 n, 翻转子数组 [1, j-1]
// 为了让最终矩阵和上面推导的一致,我们倒序循环
for (int i = 1; i < n; ++i) {
// 操作第 n-i+1 行, 翻转 [1, n-i]
std::cout << (n - i + 1) << " " << 1 << " " << (n - i) << std::endl;
}
```
## AC代码
::: 源代码
```cpp
#include <iostream>
#include <vector>
#include <numeric>
// 函数用于解决单个测试用例
void solve() {
int n;
std::cin >> n;
// 总操作数是 (n-1) + (n-1) = 2n-2
std::cout << 2 * n - 2 << std::endl;
// 第一阶段操作
// 对行 i = 1 到 n-1, 翻转子数组 [i, n]
for (int i = 1; i < n; ++i) {
std::cout << i << " " << i << " " << n << std::endl;
}
// 第二阶段操作
// 对行 j = 2 到 n, 翻转子数组 [1, j-1]
// 为了让最终矩阵和上面推导的一致,我们倒序循环
for (int i = 1; i < n; ++i) {
// 操作第 n-i+1 行, 翻转 [1, n-i]
std::cout << (n - i + 1) << " " << 1 << " " << (n - i) << std::endl;
}
}
int main() {
// 优化输入输出
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
// AC
```
:::
## 心路历程(WA,TLE,MLE……)