3 条题解

  • 0
    @ 2026-3-9 15:32:42

    另一个思路,首先就是如果要三份的和相等,那么数组的总和一定是三的倍数,并且第一份的总和是数组总和的1/3,前两份的是2/3,也就是说,我们不需要分开枚举两个间隔点i和j,实际上可以同时枚举,i这点的前缀和很好理解就是1/3总和,我们找看看有多少个i可以切前1/3,计其个数为cnt,然后再找j,也就是切前2/3的,如果遇到了可行的j,那么总方案数会+=cnt,因为这个j可以和前面所有可行的i构成cnt种方案,以此类推找到所有可行的i和j并且算好总方案数ans,复杂度为O(n)

    import sys
    input = lambda:sys.stdin.readline().strip()
    
    n=int(input())
    a=[0]+list(map(int,input().split()))
    s=[0]*len(a)
    
    for i in range(1,n+1):
        s[i]=s[i-1]+a[i]
    
    if s[n] % 3 != 0:
        print(0)
        exit(0)
    
    tar = s[n] // 3
    ans = 0
    cnt = 0
    
    for j in range(2, n):
        if s[j-1] == tar:
            cnt += 1
        if s[j] == 2 * tar:
            ans += cnt
    print(ans)
    

    信息

    ID
    513
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    278
    已通过
    48
    上传者