1 条题解

  • 0
    @ 2025-5-8 20:23:51

    题解

    分析:看了题目发现nn100000100000,所以暴力是肯定过不了的,那么我们就可以考虑另一种类似公式递推的方法,我们先对所有牛按照位置进行排序,然后假设F[i]F[i]表示第i头牛与其他牛交谈发出的总音量,然后对于第i+1i+1头牛,我们设一个d值,代表第i头牛与第i+1i+1头牛之间的距离,那么对于第i+1i+1头牛之前的牛jj,与第i+1i+1头牛交谈产生的音量值就是第i头牛与第j头牛交谈的音量+d+d,同样,对于第i+1i+1头牛之后的牛jj,与第i+1i+1头牛交谈产生的音量值就是第ii头牛与第j头牛交谈的音量-d,所以我们可以得出递推式F[i+1]=F[i]+d(i1)+d(ni+1)F[i+1]=F[i]+d*(i-1)+d*(n-i+1),这样OnO(n)递推下去就行了,最后把音量值加起来就是所求的答案了。

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <vector>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    const int maxn=100005;
     
    int n;
    ll a[maxn]; 
    ll f[maxn];
     
    int main() {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
        scanf("%lld",&a[i]);
        }
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++) {
        f[1]+=a[i]-a[1];
        }
        ll ans=f[1];
        for(int i=2;i<=n;i++) {
        ll d=a[i]-a[i-1];
        f[i]=f[i-1]+d*(i-1)-d*(n-i+1);
            ans+=f[i];
        }
        printf("%lld\n",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    1232
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者