WTF 변환
시간 제한1초메모리 제한256 MB
두 단계 회전 누적합을 가장 크게 만드는 ID 배열을 정하고 그 최댓값과 사전 순으로 가장 작은 배열을 출력합니다.
문제
정수 개로 이루어진 배열 와 정수 이 주어진다. 의 원소에는 부터 까지 번호가 붙어 있다.
배열 는 정수 개로 이루어지고 부터 까지 번호가 붙어 있으며, 모든 원소가 구간에 들어간다.
를 사용한 의 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칸 회전한다
를 오른쪽으로 칸 회전하면 위치 에 있던 원소가 위치 로 옮겨간다. 두 반복문은 같은 배열을 읽고 회전시키므로 회전 결과가 다음 단계로 이어지고, 부호를 바꾸는 연산도 첫 반복문이 끝난 시점의 배열에 적용된다.
의 모든 원소는 이하이므로 은 항상 구간 안에 있다.
와 은 알지만 는 모른다. 를 골라서 만들 수 있는 sum의 최댓값을 구하라.
입력
첫째 줄에 정수 과 이 주어진다. (, )
둘째 줄에 부터 까지 정수 개가 주어진다. 각 원소는 구간의 정수다.
출력
첫째 줄에 sum의 최댓값을 출력한다.
둘째 줄에 그 최댓값을 만드는 부터 까지 정수 개를 공백 한 칸으로 구분해 출력한다. 최댓값을 만드는 배열이 여러 개면 사전순으로 가장 앞서는 것을 출력한다. 즉 최댓값을 만드는 배열 중에서 이 가장 작은 것을 고르고, 그런 배열이 여럿이면 가 가장 작은 것을 고르는 식으로 정한다.