3 条题解
-
0
另一个思路,首先就是如果要三份的和相等,那么数组的总和一定是三的倍数,并且第一份的总和是数组总和的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
- 上传者