Problem
You’ve got array a[1], a[2], …, a[n], consisting of n integers. Count the number of ways to split all the elements of the array into three contiguous parts so that the sum of elements in each part is the same.
More formally, you need to find the number of such pairs of indices i, j (2 ≤ i ≤ j ≤ n - 1), that .
Input
The first line contains integer n (1 ≤ n ≤ 5·105), showing how many numbers are in the array. The second line contains n integers a[1], a[2], …, a[n] (|a[i]| ≤ 109) — the elements of array a.
Output
Print a single integer — the number of ways to split the array into three parts with the same sum.
Examples
input
5
1 2 3 0 3
output
2
input
4
0 1 -1 0
output
1
input
2
4 1
output
0
题目大致意思为:给你一串数组 在不改变数组顺序情况下 将数组的总和分成平等的三份
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<stdio.h>
#include<limits.h>
#include<cmath>
#include<set>
#include<map>
#define ll long long
using namespace std;
ll s[500005];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
s[i + 1] = s[i] + a;//用前缀和记录每组总和
}
ll ans = 0;
if (s[n] % 3 == 0)//如果数组不能够被三整除 直接输出0组
{
ll u = s[n] / 3;//一份数组和
ll v = 2 * s[n] / 3;
ll cnt = 0;
for (int i = 1; i < n; i++)
{
if (s[i] == v)
{
ans += cnt;
}
if (s[i] == u)
{
cnt++;
}
}
}
cout << ans << endl;
return 0;
}
这篇文章探讨了如何计算给定数组如何分割成三个部分,使得每个部分的元素之和相等。通过前缀和和双指针技巧,博主展示了如何找出符合条件的分割方式数量。输入是一个整数数组,输出是满足条件的划分方案数。
2963

被折叠的 条评论
为什么被折叠?



