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;
}



















