zoukankan      html  css  js  c++  java
  • cf466C Number of Ways

    C. Number of Ways
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    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.

    Sample test(s)
    input
    5
    1 2 3 0 3
    
    output
    2
    
    input
    4
    0 1 -1 0
    
    output
    1
    
    input
    2
    4 1
    
    output
    0
    

    题意是给定50w的序列,要求分成连续的3份,使得每一份的和相等。

    一开始没想出来……然后被黄巨大D成sb

    先判一下总的sum是不是3的倍数,不是直接return

    然后求个前缀和、后缀和,显然当且仅当前缀和=后缀和=sum/3时方案可行

    然后for一遍,先判断后缀和是否=sum/3,如果是,答案更新为(当前前缀和=sum/3的个数),这个可以在for的时候算出来

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #include<ctime>
    #define LL long long
    using namespace std;
    int n;
    int a[500010];
    LL s[500010];
    LL t[500010];
    LL ans,tot,toadd;
    inline LL read()
    {
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int main()
    {
    	n=read();
    	for (int i=1;i<=n;i++)a[i]=read(),tot+=a[i];
    	if (tot%3)
    	{
    		printf("0");
    		return 0;
    	}
    	tot/=3;
    	for (int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
    	for (int i=n;i>=1;i--)t[i]=t[i+1]+a[i];
    	for (int i=2;i<=n;i++)
    	  {
    	  	if (t[i]==tot) ans+=toadd;
    	  	if (s[i-1]==tot)toadd++;
    	  }
    	printf("%lld",ans);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    我为什么写博客
    Jquery选中行实现行中的Checkbox的选中与取消选中
    jquery中attr和prop的区别
    如何将.il、.res文件封装成dll文件
    修改VS2010生成的dll文件中的内容
    asp.net mvc4中自定义404页面
    asp.net EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
    ASP.NET中JSON的序列化和反序列化(转)
     WPF 控件总结
    C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/zhber/p/4035995.html
Copyright © 2011-2022 走看看