AtCoder Grand Contest 023 / A - Zero-Sum Ranges

解法

  1. 入力配列の累積和を作る(A(n) -> s(n+1))。
  2. 累積和の値について同じ値を集計する。※累積和のうち{i \lt j}について{s_i = s_j}となる区間は累積和が0になる。

  3. (Pythonの場合) collectionsにあるCounterで累積和の同じ数を集計する。

  4.  {s_i} (n個)の中で2個選ぶ組み合わせの総数を、すべての登場した数について数えあげる( k個の中で n個を選ぶ組み合わせは \frac{k(k-1)}{2}

import sys
from collections import Counter

def solve(N: int, A: "List[int]"):
    s = [0]*(N+1)

    for i in range(N):
        s[i+1] = s[i] + A[i]

    # print(s[:10])

    c = Counter(s)

    ans = 0
    for k,v in c.items():
        ans += v*(v-1)//2

    print(ans)
    
    return

参考

解説AC @drkenさんの神解説

qiita.com