题目

image-1676360318618

题解

将1-n分成三段,只需要枚举两个位置即可。首先枚举第二个位置i,然后枚举第一个位置j,其中由于每段不能为空,所以j只能在2i-2这之间,如果s[2i-2]==s[n]/3则说明第一刀成立,cnt++,那么还要使第二段的和为s[n]/3,只需要s[n]-s[i-1]==s[n]/3即可

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n;
int s[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]+=s[i-1];
    }
    if(s[n]%3){
        puts("0");
        return 0;
    }
    long long ans=0;
    for(int i=3,cnt=0;i<=n;i++){
        if(s[i-2]==s[n]/3)cnt++;
        if(s[n]-s[i-1]==s[n]/3)ans+=cnt;
    }
    cout<<ans<<endl;
    
    return 0;
}