题解:AT_abc353_c [ABC353C] Sigma Problem
Idea
因为 ,所以 。
考虑对于 和 的情况分开讨论。
在 时,这一组数对答案的贡献即为 。
反之,则贡献为 。
所以我们可以对 序列从小到大排序,排序之后序列满足单调性。
可以对于每一个 ,二分出一个 使 且 。这一部分是 的。
因为有单调性,所以对于任意的 使 ,。
我们可以发现,最后对于每一个 ,会减掉 个 。
而设要减 个 ,则答案为:
如何求每一对 呢?考虑拆开:每一个 会被加 次(与 个 相加) ,所以设 数组总和为 ,则每一对 的总和为 。这里是 的。
所以我们就能在 的时间复杂度内解决了。
Tip
- 本题可能会爆
int。
Code
#include<bits/stdc++.h>
using namespace std;
long long sum;
long long cnt=0;
int n,a[300005];
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
a[n+1]=100000000;
for(int i=1;i<=n;i++){
int x=100000000-a[i];
int _=lower_bound(a+i+1,a+n+2,x)-a;
// cout<<_<<' ';
cnt+=(n-_+1);
sum+=a[i];
}
sum=1ll*sum*(n-1);
sum-=cnt*100000000;
cout<<sum;
return 0;
}

浙公网安备 33010602011771号