给定一个长度为 n 的数组 a1,a2,…,an。
现在,要将该数组从中间截断,得到三个非空子数组。
要求,三个子数组内各元素之和都相等。
请问,共有多少种不同的截断方法?
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
输出一个整数,表示截断方法数量。
数据范围
前六个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤105,−10000≤ai≤10000。输入样例1:
4 1 2 3 3
输出样例1:
1
输入样例2:
5 1 2 3 4 5
输出样例2:
0
输入样例3:
2 0 0
输出样例3:
0
分成三个相等的份数,就是总和的1/3,那么就一次判断
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
constexpr int N=1e5+7;
typedef long long ll;
int n,a[N],cnt[N];
vector<int>q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
if(a[n]%3!=0){
printf("0\n");
}
else {
for (int i = 1; i <= n; i++) {
cnt[i] = cnt[i - 1];
if (a[i] == a[n] / 3) {
cnt[i]++;
}
if (a[i] == a[n] / 3 * 2&&i!=1&&i!=n){
q.push_back(i);
}
}
ll ans=0;
for(auto it:q){
ans+=cnt[it-1];
}
printf("%lld\n",ans);
}
return 0;
}