2 条题解

  • 0
    @ 2022-11-6 21:33:09
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    using namespace std;
    const int maxn=1e6+10;
    long long a[maxn],sum[maxn];
    int main()
    {
    	int n;
    	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++){
    		sum[i]=sum[i-1]+a[i];
    	}
    	long long ans=0;
    	for(int i=1;i<=n;i++){
    		long long l=i,r=n+1;
    		while(l<r){
    			long long mid=(l+r)/2;
    			if(a[mid]<1000-a[i]){
    				l=mid+1;
    			}else{
    				r=mid;
    			}
    		}·
            ans=ans+(1000-a[i])*(r-i);
            ans=ans-(sum[r-1]-sum[i-1]);//处理负数的部分
            ans=ans+a[i]*(n-r+1)+(sum[n]-sum[r-1]);
            ans=ans-1000*(n-r+1);//处理正数的部分
    	}
    	printf("%lld",ans);
    	return 0;
    }
    

    二分加前缀和的傻子解法(0^0)

    信息

    ID
    832
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    141
    已通过
    11
    上传者