배열 공부

시간 제한2초메모리 제한512 MB

요약
1과 -1로 이루어진 배열에서 q개의 구간 질의마다 그 안에 합이 0인 가장 긴 부분 배열의 길이를 구해 모두 더해 출력한다.
난이도

어려움10점 중 8점

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

문제

Vasya는 배열을 공부하는 것을 좋아한다. 최근 부모님이 1과 -1로만 이루어진 배열 aa를 선물로 주셨고, Vasya는 곧바로 이 배열을 공부하기 시작했다.

Vasya는 0도 좋아한다. 그래서 배열 aa의 여러 부분 배열 a[li,…,ri]a[l_i, \ldots, r_i]를 살펴보기로 했다. 각 부분 배열마다 합이 0인 부분 배열의 최대 길이를 구한다. 그러한 부분 배열이 없으면 답을 0으로 본다. Vasya는 qq개의 부분 배열 질의 [li,ri][l_i, r_i]를 적어 두었고, 이제 각 질의의 답을 모두 더한 값을 구하려고 한다.

예를 들어 예제를 보자.

  • 부분 배열 [1,5][1, 5]: 합이 0인 최대 부분 배열은 [2,5][2, 5]이다.
  • 부분 배열 [1,3][1, 3]: 합이 0인 최대 부분 배열은 [2,3][2, 3]이다.
  • 부분 배열 [2,4][2, 4]: 합이 0인 최대 부분 배열은 [2,3][2, 3]이다.
  • 부분 배열 [3,4][3, 4]: 합이 0인 부분 배열이 없다.
  • 부분 배열 [3,5][3, 5]: 합이 0인 최대 부분 배열은 [4,5][4, 5]이다.

따라서 예제의 답을 모두 더하면 4+2+2+0+2=104 + 2 + 2 + 0 + 2 = 10이다.

입력

입력은 여러 테스트 케이스로 이루어진다. 첫째 줄에 테스트 케이스의 수 tt가 주어진다 (1≤t≤10001 \le t \le 1000).

각 테스트 케이스는 다음과 같다. 첫째 줄에 배열의 원소 수 nn이 주어진다 (1≤n≤1051 \le n \le 10^5).

다음 줄에 nn개의 정수 aia_i가 주어진다. aia_i는 배열의 원소이며 ai=−1a_i = -1 또는 ai=1a_i = 1이다.

다음 줄에 Vasya가 궁금해하는 부분 배열의 수 qq가 주어진다 (1≤q≤1051 \le q \le 10^5).

이어서 qq개의 줄에 두 정수 li,ril_i, r_i가 주어진다. 각각 ii번째 부분 배열의 왼쪽과 오른쪽 경계이다 (1≤li≤ri≤n1 \le l_i \le r_i \le n).

한 입력 데이터의 모든 테스트 케이스에서 nn의 합은 10510^5을 넘지 않고, qq의 합도 10510^5을 넘지 않는다.

출력

각 테스트 케이스마다 주어진 qq개의 부분 배열에 대한 답의 합을 한 정수로 출력한다.

예제1

  1. 예제 1

    입력
    1
    5
    1 -1 1 1 -1
    5
    1 5
    1 3
    2 4
    3 4
    3 5
    
    예상 출력
    10