传送门:http://codeforces.com/contest/466/problem/C
分成相等的三段,当a[ ]在 i 和 j 处都等于sum / 3 时(i< j),不难想到 sum(a[i+1] + a[i+2] .....a[j])= 0。那么找到sum * 2 / 3 的点时,直接加上前面的 sum / 3的点的个数就好了(和为0 的那段分给前或后都没关系)。
#include<stdio.h>
#define N 500005
__int64 a[N];
int main()
{
int n;
while(~scanf("%d", &n))
{
a[0] = 0;
__int64 x;
for(int i = 1; i <= n; i++)
{
scanf("%I64d", &x);
a[i] = a[i-1] + x;
}
if(a[n] % 3 != 0)
{
printf("0");
continue;
}
x = a[n] / 3;
__int64 ans = 0, k = 0;
for(int i = 1; i < n; i++)
{
if(a[i] == (x * 2))
{
ans += k;
}
if(a[i] == x)
{
k++;
}
}
printf("%I64d\n", ans);
}
return 0;
}