1 条题解

  • 0
    @ 2026-6-14 14:49:51

    好短……

    思路

    首先,求i=1nj=i+1najai\sum_{i=1}^{n}\sum_{j=i+1}^{n} a_j-a_i这个式子很容易,但是最关键的是题目要求的是max(ajai,0)max(a_j-a_i,0),这咋整?

    首先假设我们要求i=1nj=i+1najai\sum_{i=1}^{n}\sum_{j=i+1}^{n} a_j-a_i,定义一个ansans初始值为i=1nj=i+1naj\sum_{i=1}^{n}\sum_{j=i+1}^{n} a_j,这很简单,然后对于每一个aia_i,假设一共有kk个数比它大,那么ansans就减去ai×ka_i\times k,最后输出ansans即可。

    为啥了?

    现在有两个数xx,yy(xyx\leq y),若xxyy的左边,那么因为ansans提前有加过一个yy,所以我们直接减去一个xx即可,如果xxyy的右边,那因为我们提前加过一个xx,但是xy0x-y\leq 0,所以我们需要把xx的贡献也减掉,也就是把ansans减去xx,因此不管怎样,我们都需要ansxans-x

    AC代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=4e5+10;
    int n,a[N];
    signed main()
    {
    	scanf("%lld",&n);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    	int ans=0;
    	for(int i=1;i<=n;i++)ans+=a[i]*(i-1);
    	sort(a+1,a+n+1); 
    	for(int i=1;i<=n;i++)ans-=a[i]*(n-i);
    	printf("%lld\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    7766
    时间
    2000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    7
    已通过
    6
    上传者