[CF1474E] What Is It?
Description
给定一个排列,你可以选择 (i,j (a[j]=i)),交换 (a[i],a[j]),收益为 ((i-j)^2),构造长度为 (n) 的排列,使得收益最大。
Solution
至多交换 (n-1) 次,距离为 (n-1) 的至多一对,距离为 (n-2,n-3,...) 的至多两对……
最大收益为 ((n-1)^2 + 2(n-2)^2 + 2(n-3)^2 + ...)
从顺序开始先换 (1,n),然后换 (1,n-1) 和 (2,n),然后换 (1,n-2) 和 (3,n),……
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n, a[N];
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
a[i] = i;
int x = n - 1;
vector<pair<int, int>> op;
int ans = 0;
for (int i = n - 1; i >= 1; i--)
{
if (x)
{
x--;
swap(a[1], a[1 + i]);
op.push_back({1 + i, 1});
ans += i * i;
}
if (x && i < n - 1)
{
x--;
swap(a[n], a[n - i]);
op.push_back({n - i, n});
ans += i * i;
}
}
cout << ans << endl;
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
cout << n - 1 << endl;
for (int i = op.size() - 1; i >= 0; i--)
cout << op[i].first << " " << op[i].second << endl;
}
}