其他分享
首页 > 其他分享> > [CF1474E] What Is It? - 构造

[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