만드는 중입니다

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

수열의 분할

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

요약
수열을 연속된 부분으로 나눌 때, 각 부분 합의 제곱을 모두 더한 값 중 k번째로 큰 값을 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 누적 합, 힙
정답자
아직 제출이 없습니다

문제

길이가 nn인 정수 수열 A=(a1,…,an)A = (a_1, \ldots, a_n)이 주어진다. mm개의 정수 수열 B1,…,BmB_1, \ldots, B_m (m≥1m \ge 1)이 다음 두 조건을 모두 만족하면 (B1,…,Bm)(B_1, \ldots, B_m)을 AA의 분할이라고 부른다.

  • 각 BiB_i (1≤i≤m1 \le i \le m)는 길이가 1 이상인 정수 수열이다.
  • B1,…,BmB_1, \ldots, B_m을 이 순서대로 이어 붙이면 AA와 같다.

예를 들어 (3,1,4,1,5)(3, 1, 4, 1, 5), ((3),(1,4),(1,5))((3), (1, 4), (1, 5))는 모두 (3,1,4,1,5)(3, 1, 4, 1, 5)의 분할이다.

정수 수열 BB에 대해 BB 원소 합의 제곱을 f(B)f(B)라고 한다. AA의 분할 (B1,…,Bm)(B_1, \ldots, B_m)에 대해 f(B1)+⋯+f(Bm)f(B_1) + \cdots + f(B_m)을 이 분할의 점수라고 부른다. 예를 들어 ((3),(1,4),(1,5))((3), (1, 4), (1, 5))의 점수는 32+(1+4)2+(1+5)2=703^2 + (1+4)^2 + (1+5)^2 = 70이다.

AA의 분할은 정확히 2n−12^{n-1}개 있다. AA의 모든 분할에 대한 점수를 내림차순으로 정렬했을 때 kk번째 값을 구하라.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 데이터셋의 수는 30을 넘지 않는다. 각 데이터셋은 다음 형식으로 주어진다.

nn kk

a1a_1 a2a_2 …\ldots ana_n

nn과 kk는 정수이며 1≤n≤10001 \le n \le 1000, 1≤k≤min⁡{2n−1,2000}1 \le k \le \min\{2^{n-1}, 2000\}을 만족한다. 각 aia_i는 수열 AA의 ii번째 원소인 정수이며 −106≤ai≤106-10^6 \le a_i \le 10^6을 만족한다.

입력의 끝은 0 0 한 줄로 나타낸다.

출력

각 데이터셋에 대해 AA의 모든 분할 점수 중 kk번째로 큰 값을 한 줄에 출력하라.

예제1

  1. 예제 1

    입력
    5 1
    3 1 4 1 5
    5 6
    3 1 4 1 5
    14 255
    2024 6 29 14 0 -17 0 2024 7 5 16 30 -19 30
    0 0
    
    예상 출력
    196
    100
    8484005