AcWing 3956. 截断数组

给定一个长度为 n 的数组 a1,a2,,an

现在,要将该数组从中间截断,得到三个非空子数组。

要求,三个子数组内各元素之和都相等。

请问,共有多少种不同的截断方法?

输入格式

第一行包含整数 n

第二行包含 n个整数 a1,a2,,an

输出格式

输出一个整数,表示截断方法数量。

数据范围

前六个测试点满足 1n10
所有测试点满足 1n10510000ai10000

输入样例1:

4
1 2 3 3

输出样例1:

1

输入样例2:

5
1 2 3 4 5

输出样例2:

0

输入样例3:

2
0 0

输出样例3:

0

代码实现:

#include<iostream>
using namespace std;
#define int long long
const int N=1e5+5;
int a[N],cnt[N],cnt1[N],s[N];
signed main(){
    int n,res=0;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]+a[i];
    }
    for(int i=1;i<=n;i++){
        if(s[i]*3==s[n])cnt[i]=1;
    }
    for(int i=1;i<=n;i++)cnt1[i]=cnt1[i-1]+cnt[i];
    for(int i=n;i>=3;i--){
        int sum=s[n]-s[i-1];
        if(sum*3==s[n])res+=cnt1[i-2];
    }
    cout<<res<<endl;
    return 0;
}

 

posted @ 2023-03-30 14:33  回忆、少年  阅读(7)  评论(0编辑  收藏  举报