题目描述
给出长度为n的01数组,对于 i , j ( i ≠ j ) i,\ j(i \neq j) i, j(i=j),求出所有 ∣ ( i − j ) ∗ ( a i − a j ) ∣ |(i-j)*(a_i-a_j)| ∣(i−j)∗(ai−aj)∣的和
思路
因为只有0和1
并且能够做出贡献的只有异点
所以我们可以边读边记录0和1的位置和
并算出答案
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
ll suma, sumb, numa, numb, n, k, Ans;
int main()
{
scanf("%lld", &n);
for(ll i = 1; i <= n; ++i)
{
scanf("%lld", &k);
if(k == 1)
{
Ans += (numa * i) - suma;
sumb += i, numb++;
}
else
{
Ans += (numb * i) - sumb;
suma += i, numa++;
}
}
printf("%lld", Ans);
return 0;
}