Codeforces 466C Number of Ways

来源:互联网 发布:淘宝客招募网站 编辑:程序博客网 时间:2024/06/05 08:44
#include <bits/stdc++.h>
using namespace std;
long long a[500010];
//标程上给的其实和我的想法差不多
//只不过是人家直接拿数组存起来了
//用后缀和的形式,而我采用时二分,其实都一样了
//但是另外有人给出的更巧妙,牛的一批
//首先进行转换一下,也就是说我现在考虑的不是单独一个元素
//而是前缀和,这在输入的时候就可以处理了,然后就不用考虑这个
//元素数组,而转而考虑这个前缀和数组
//只需遍历一次前缀和数组,找到其中和为s/3的个数和s*2/3的个数
//乘起来就是答案了
int main(void)
{
   // freopen("in.txt","r",stdin);
    vector<int>vb;
    vector<int>vc;
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long sum=0;
    long long n;
    cin>>n;

    for(long long i=0;i<n;++i)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if(n<3)
    {
        cout <<0<<endl;
        return 0;
    }
    if(sum%3!=0)
    {
        cout <<0<<endl;
        return 0;
    }
    else
    {
        long long sum1=0;
        for(int i=0;i<n-2;++i)
        {
            sum1+=a[i];
            if(sum1==sum/3)
            {
                vb.push_back(i);
            }
        }
        if(vb.size()==0)
        {
            cout <<0<<endl;
            return 0;
        }
        long long sum2=0;
        for(int i=n-1;i>=2;i--)
        {
            sum2+=a[i];
            if(sum2==sum/3)
            {
                vc.push_back(i);
            }
        }
        if(vc.size()==0)
        {
            cout <<0<<endl;
            return 0;
        }
        sort(vc.begin(),vc.end());
        long long ans=0;
        for(auto i:vb)
        {
            ans+=(vc.end()-(upper_bound(vc.begin(),vc.end(),i+1)));
        }
        cout <<ans<<endl;
    }
    return 0;
}