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

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

WTF 변환

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

요약
두 단계 회전 누적합을 가장 크게 만드는 ID 배열을 정하고 그 최댓값과 사전 순으로 가장 작은 배열을 출력합니다.
난이도

보통10점 중 7점

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

문제

정수 NN개로 이루어진 배열 AA와 정수 RR이 주어진다. AA의 원소에는 A[1]A[1]부터 A[N]A[N]까지 번호가 붙어 있다.

배열 IDID는 정수 N+1N + 1개로 이루어지고 ID[1]ID[1]부터 ID[N+1]ID[N+1]까지 번호가 붙어 있으며, 모든 원소가 [1,N−1][1, N-1] 구간에 들어간다.

IDID를 사용한 AA의 Warshall-Turing-Fourier 변환은 다음 알고리즘이다. (이 변환은 지어낸 것이고 이 문제 밖에서는 존재하지 않는다.)

sum = 0

for i = 1 to N
    index = min(ID[i], ID[i+1])
    sum = sum + A[index]
    A를 오른쪽으로 R칸 회전한다

A의 모든 원소의 부호를 바꾼다

for i = 1 to N
    index = max(ID[i], ID[i+1]) + 1
    sum = sum + A[index]
    A를 오른쪽으로 R칸 회전한다

AA를 오른쪽으로 RR칸 회전하면 위치 jj에 있던 원소가 위치 ((j+R−1) mod N)+1((j + R - 1) \bmod N) + 1로 옮겨간다. 두 반복문은 같은 배열을 읽고 회전시키므로 회전 결과가 다음 단계로 이어지고, 부호를 바꾸는 연산도 첫 반복문이 끝난 시점의 배열에 적용된다.

IDID의 모든 원소는 N−1N - 1 이하이므로 max⁡(ID[i],ID[i+1])+1\max(ID[i], ID[i+1]) + 1은 항상 [1,N][1, N] 구간 안에 있다.

AA와 RR은 알지만 IDID는 모른다. IDID를 골라서 만들 수 있는 sum의 최댓값을 구하라.

입력

첫째 줄에 정수 NN과 RR이 주어진다. (2≤N≤30002 \le N \le 3000, 1≤R<N1 \le R < N)

둘째 줄에 A[1]A[1]부터 A[N]A[N]까지 정수 NN개가 주어진다. 각 원소는 [−104,104][-10^4, 10^4] 구간의 정수다.

출력

첫째 줄에 sum의 최댓값을 출력한다.

둘째 줄에 그 최댓값을 만드는 ID[1]ID[1]부터 ID[N+1]ID[N+1]까지 정수 N+1N + 1개를 공백 한 칸으로 구분해 출력한다. 최댓값을 만드는 배열이 여러 개면 사전순으로 가장 앞서는 것을 출력한다. 즉 최댓값을 만드는 배열 중에서 ID[1]ID[1]이 가장 작은 것을 고르고, 그런 배열이 여럿이면 ID[2]ID[2]가 가장 작은 것을 고르는 식으로 정한다.

예제2

  1. 예제 1

    입력
    5 3
    1 -1 1 -1 1
    
    예상 출력
    10
    1 1 1 2 2 3
    
  2. 예제 2

    입력
    6 5
    2 5 4 1 3 5
    
    예상 출력
    16
    3 2 1 1 5 4 1