1 条题解

  • 0
    @ 2025-9-14 19:50:10

    (以下的 rir_i 下标从 00 开始)

    题目要求我们求以下函数的最小值:

    f(c)=∑i=0n−1i⋅r(i+c) mod nf(c)=\sum_{i=0}^{n-1} i \cdot r_{(i+c) \bmod n}

    观察发现,O(n)O(n) 求出 f(0)f(0) 和 S=∑i=0n−1\displaystyle S=\sum_{i=0}^{n-1} 后,f(i)f(i) 可以通过 f(i−1)f(i-1) 由 O(1)O(1) 求出:

    f(i)=f(i−1)−S+n⋅ri−1f(i)=f(i-1)-S+n \cdot r_{i-1}

    直接求出 nn 个函数值后输出最小值即可。

    #include <bits/stdc++.h>
    using namespace std;
    long long a[10000012], b[10000012];
    int main()
    {
        ios::sync_with_stdio(0);
    	int n;
    	cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            a[i + n] = a[i];
        }
        for (int i = 1; i <= n + n; i++)
            b[i] = b[i - 1] + a[i];
        long long ans = 0, aa = 0;
        for (int i = 1; i <= n; i++)
            ans += 1ll * a[i] * (i - 1);
        aa = ans;
        for (int i = 2, j = n + 1; i <= n; i++, j++)
        {
            aa -= b[j - 1] - b[i - 1];
            aa += 1ll * (n - 1) * a[j];
            ans = min(ans, aa);
        }
        cout << ans % 998244353 << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    58
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    12
    已通过
    4
    上传者