C. Manhattan Permutations
曼哈顿排列的值是
给定曼哈顿排列值,要求构造出这个排列。
Solution
每次都能想到正确思路,但是就是写不出来,总感觉差点什么...
构造
首先讨论不可能的情况:
- 显然
是奇数不可能 太大超过这个排列最大能到的数据也不可能
最大的数据是:
即
拆开化简后最大值即为 $$2\times\lfloor{\frac{n+1}{2}}\rfloor(n-\lfloor{\frac{n+1}{2}}\rfloor)$$
再讨论符合条件的情况如何构造:
当
若
能构造的值
若
后面的同理,容易知道能够构造所有合理值。
Example
例如:
下一轮若 2 和 4 交换可以构造
#define int long long
void solve() {
int n, k;cin >> n >> k;
int m = (n + 1) / 2;
int p = 2 * m * (n - m);
if (k & 1 || k > p) {
cout << "NO\n";return;
}
cout << "YES\n";
vector<int> a(n + 1);
for (int i = 1;i <= n;i++)a[i] = i;
k /= 2;
for (int i = 1;k > 0;i++) {
if (k < n - 2 * i + 1) {
swap(a[i], a[i + k]);k = 0;
} else {
swap(a[i], a[n - i + 1]);
k -= n - 2 * i + 1;
}
}
for (int i = 1;i <= n;i++)cout << a[i] << " \n"[i == n];
}