Problem - 466C - Codeforces
Number of Ways - 洛谷
解析:
首先判断所有数总和是否能被三整除。
之后遍历前缀和数组,如果某个位置的前缀和等于sum/3,则记录。
某个位置前缀和等于sum/3*2则记录答案。
注意由于分成三份,所以同一个位置不能放置两个标记,所以先判断2/3倍答案。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+5;
int n,a[N],sum[N];
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(sum[n]%3){
printf("0");
return 0;
}
int k=sum[n]/3,res=0,cnt=0;
for(int i=1;i<n;i++){
if(sum[i]==2*k) res+=cnt;
if(sum[i]==k) cnt++;
}
cout<<res;
return 0;
}