Day 36 C. Number of Ways

这篇文章探讨了如何计算给定数组如何分割成三个部分,使得每个部分的元素之和相等。通过前缀和和双指针技巧,博主展示了如何找出符合条件的分割方式数量。输入是一个整数数组,输出是满足条件的划分方案数。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值