题解:要把数组分为三个子数组,设两个截断点分别为i , j
每个子数组内的元素和相同,所以两个截断点i , j 相当于是对称的,因此可将第二个截断点j 固定,然后再找符合题意的 i
详解见图片
![](https://i-blog.csdnimg.cn/blog_migrate/9e326648964a288c807ec17c4e4fc090.jpeg)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],s[100010];
int main(){
cin>>n;
s[100010]={0};
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
if(s[n]%3){
cout<<0;
}
else{
long long res=0,cnt=0;
for(int j=3;j<=n;j++){//若是 j 的取值范围为[2,n-1]
if(s[j-2]==s[n]/3) cnt++;//s[j-1]==s[n]/3
if(s[j-1]==s[n]/3*2) res+=cnt;//s[j]==s[n]/3*2
}
cout<<res;
}
}