[CF1474E] What Is It? - 构造
作者:互联网
[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;
}
}
标签:至多,What,int,构造,CF1474E,ans,--,op 来源: https://www.cnblogs.com/mollnn/p/14336213.html