아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가장 가까운 절댓값 합

시간 제한1초메모리 제한128 MB

요약
여러 개의 목표값에 대해 연속 부분 배열의 절댓값 합이 목표값에 가장 가까운 값을 찾아 출력한다.
난이도

보통10점 중 6점

유형
누적 합, 정렬, 이분 탐색, 투 포인터
정답자
아직 제출이 없습니다

문제

우주에서 온 것으로 추정되는 신호가 수신되어 정수 데이터로 변환되었습니다. 각 신호는 두 부분으로 이루어집니다. 정수 nn개로 이루어진 수열과, 음이 아닌 정수 목표값 tt입니다.

길이 nn인 정수 수열 a1,a2,…,ana_1, a_2, \ldots, a_n과 음이 아닌 목표값 tt가 주어집니다. 비어 있지 않은 연속 부분 구간 al,al+1,…,aua_l, a_{l+1}, \ldots, a_u (1≤l≤u≤n1 \le l \le u \le n) 각각에 대해, 그 절댓값 합을 ∣al+al+1+⋯+au∣|a_l + a_{l+1} + \cdots + a_u|로 정의합니다.

모든 부분 구간 중에서 절댓값 합이 tt에 가장 가까운, 즉 ∣(절댓값 합)−t∣|(\text{절댓값 합}) - t|를 최소로 만드는 구간을 찾아 그 절댓값 합을 출력하세요. 만약 서로 다른 두 절댓값 합이 tt로부터 똑같이 가깝다면 더 작은 값을 출력합니다.

입력

입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스는 두 정수 nn과 kk로 시작합니다. n=k=0n = k = 0인 경우 입력이 종료됩니다. 그 외의 경우 1≤n≤1000001 \le n \le 100000이며, 이어서 수열을 이루는 정수 nn개가 주어집니다. 각 정수의 절댓값은 1000010000 이하입니다. 그다음 이 수열에 대한 질의 kk개가 주어지며, 각 질의는 목표값 tt 하나로 0≤t≤10000000000 \le t \le 1000000000입니다.

출력

각 질의마다, 절댓값 합이 tt에 가장 가까운 부분 구간의 절댓값 합을 한 줄에 하나씩 출력합니다. 즉 ∣(절댓값 합)−t∣|(\text{절댓값 합}) - t|를 최소로 만드는, 비어 있지 않은 구간의 ∣al+⋯+au∣|a_l + \cdots + a_u| 값을 출력하며, 똑같이 가까운 절댓값 합이 두 개 있으면 더 작은 값을 출력합니다.

예제3

  1. 예제 1

    입력
    5 1
    -10 -5 0 5 10
    3
    10 2
    -9 8 -7 6 -5 4 -3 2 -1 0
    5 11
    15 2
    -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    15 100
    0 0
    
    예상 출력
    5
    5
    9
    15
    15
    
  2. 예제 2

    입력
    1 1
    7
    3
    0 0
    
    예상 출력
    7
    
  3. 예제 3

    입력
    2 1
    4 2
    5
    0 0
    
    예상 출력
    4