만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

매우 좋아하는 수열

시간 제한6초메모리 제한1024 MB

요약
정수 배열의 모든 연속 부분합을 시작 인덱스, 끝 인덱스 순으로 나열한 수열에서 세 값의 합이 0이 되는 인덱스 삼중쌍 i<j<k의 개수를 구합니다.
난이도

보통10점 중 7점

유형
누적 합, 배열, 해시맵
정답자
아직 제출이 없습니다

문제

3SUM은 잘 알려진 알고리즘 문제다. 정수 수열 c1,c2,…,cmc_1, c_2, \ldots, c_m이 주어졌을 때, ci+cj+ck=0c_i + c_j + c_k = 0을 만족하는 인덱스 i<j<ki < j < k를 찾는다.

임의의 정수 수열에 대해서는 O(m2)O(m^2)보다 확실히 빠른 알고리즘이 알려져 있지 않다. 그러나 Bajtek은 이 사실을 모르고, 자신의 매우 좋아하는 수열에 대해 이 문제를 풀기로 한다.

Bajtek이 좋아하는 수열은 정수 nn개 a1,a2,…,ana_1, a_2, \ldots, a_n으로 이루어진다. 매우 좋아하는 수열은 이 수열의 연속 부분 구간 n(n+1)/2n(n+1)/2개를 모두 골라 각 구간의 합을 구하고, 그 합들을 한 수열에 모아 만든다. 같은 값이 여러 번 나오면 모두 포함한다. 합들은 구간의 시작 인덱스가 작은 순서로 정렬하고, 시작 인덱스가 같으면 끝 인덱스가 작은 순서로 정렬한다.

Bajtek은 세 원소를 찾는 데에는 관심이 없다. 그는 합이 0이 되는 인덱스 세 개 i<j<ki < j < k의 정확한 개수를 알고 싶어 한다. 이 개수를 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 정수 nn (1≤n≤5001 \le n \le 500)이 주어진다. Bajtek이 좋아하는 수열의 길이다.

두 번째 줄에는 정수 aia_i가 nn개 주어진다 (∣ai∣≤20000|a_i| \le 20000). 좋아하는 수열의 원소들이다.

출력

정수 하나를 출력한다. 매우 좋아하는 수열의 대응하는 원소들의 합이 00이 되는 인덱스 조합 i<j<ki < j < k의 개수다.

힌트

첫 번째 테스트에서 매우 좋아하는 수열은 [7,3,1,−4,−6,−2][7, 3, 1, -4, -6, -2]이다. 합이 0이 되는 서로 다른 원소 세 개는 3+1+(−4)3 + 1 + (-4)뿐이므로 답은 1이다.

두 번째 테스트에서 매우 좋아하는 수열은 0이 55개로 이루어진다. 어떤 인덱스 세 개를 골라도 합은 0이고, 그런 조합은 26235개다.

예제2

  1. 예제 1

    입력
    3
    7 -4 -2
    
    예상 출력
    1
    
  2. 예제 2

    입력
    10
    0 0 0 0 0 0 0 0 0 0
    
    예상 출력
    26235