2 条题解
-
0
#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
- 上传者