给定一个长度为 n 的数组 a1,a2,…,an
。
现在,要将该数组从中间截断,得到三个非空子数组。
要求,三个子数组内各元素之和都相等。
请问,共有多少种不同的截断方法?
输入格式
第一行包含整数 n
。
第二行包含 n
个整数 a1,a2,…,an
。
输出格式
输出一个整数,表示截断方法数量。
数据范围
前六个测试点满足 1≤n≤10
。
所有测试点满足 1≤n≤105,−10000≤ai≤10000。
题解:
正常是枚举俩个分割点但时间复杂度为o(n^2);
会超时;
优化:只需要枚举一个分割点,当该分割点为数组和的三分之一时标记一下;
当分割点为数组和三分之二时将前面分割点为数组和三分之一加入总和;
# include <bits/stdc++.h>
using namespace std;
# define int long long
const int N=1e5+10;
int s[N];
signed main()
{
int n;
cin>>n;
s[0]=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
s[i]=s[i-1]+x;
}
if(s[n]%3!=0)
{
cout<<"0";
return 0;
}
int cnt=0;
int res=0;
for(int i=2;i<=n-1;i++)
{
if(s[i-1]==s[n]/3)
{
cnt++;
}
if(s[i]==s[n]/3*2)
{
res+=cnt;
}
}
cout<<res<<endl;
}