[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;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14336213.html