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