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

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

소 사방치기

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

요약
각 점프가 K칸 이하인 나가는 경로와, 나가는 경로에서 밟은 칸의 바로 앞 칸만 밟을 수 있는 돌아오는 경로를 골라 얻는 가치 합을 최대로 만든다.
난이도

어려움10점 중 9점

유형
동적 계획법, 세그먼트 트리, 그리디, 수학
정답자
아직 제출이 없습니다

문제

소들이 어린 시절로 돌아가 사람의 사방치기와 비슷한 놀이를 하고 있다. 이 놀이는 잔디밭에 분필로 그린 한 줄의 정사각형 칸 NN개를 사용하며, 칸에는 1…N1 \dots N의 번호가 매겨져 있다. 여기서 3≤N≤2500003 \le N \le 250000이다.

좋은 놀이가 다 그렇듯 이 사방치기에도 상금이 걸려 있다. ii번 칸에는 정수 상금 ViV_i가 적혀 있으며, −2000000000≤Vi≤2000000000-2000000000 \le V_i \le 2000000000이다. 소들은 누가 가장 많은 돈을 버는지 겨룬다.

규칙은 다음과 같다.

  • 소는 11번 칸 바로 앞에 있는 00번 칸에서 출발한다. 00번 칸에는 상금이 없다.
  • 소는 NN번 칸 방향으로 (비어 있어도 되는) 점프를 이어서 한다. 새로 착지하는 칸은 직전 칸으로부터 최대 KK칸 앞이어야 하며, 2≤K≤N2 \le K \le N이다. (예를 들어 K=2K = 2일 때 11번 칸에서는 앞으로 22번 또는 33번 칸으로 점프할 수 있다.)
  • 소는 원하는 순간에 방향을 돌려 00번 칸 쪽으로 되돌아가는 점프를 하며, 00번 칸에 도착하면 멈춘다. 돌아올 때에도 한 번에 최대 KK칸이라는 제한이 똑같이 적용되고, 다음 두 제약이 추가된다.
    1. 되돌아올 때에는 나아갈 때 밟았던 칸에는 착지할 수 없다(단 00번 칸은 예외).
    2. 00번 칸을 제외하고, 되돌아올 때 착지하는 모든 칸은 나아갈 때 착지했던 어떤 칸의 바로 앞 칸이어야 한다(즉 그 칸의 번호보다 정확히 11 작은 칸). 도중에 착지할 수 있는 복귀 칸들을 건너뛰는 더 큰 점프를 해도 된다.

소는 착지한 모든 칸의 상금의 합만큼 돈을 번다. 소가 벌 수 있는 최대 금액을 구하여라.

예시로 K=3K = 3인 여섯 칸짜리 코스를 생각해 보자.

칸 번호:   0      1      2      3      4      5      6
         +---+  +---+  +---+  +---+  +---+  +---+  +---+
         |///|--|   |--|   |--|   |--|   |--|   |--|   |
         +---+  +---+  +---+  +---+  +---+  +---+  +---+
상금:      -      0      1      2     -3      4      5

최적의 점프 순서 하나는(대괄호 안은 그 칸에서 얻는 상금) 1[0], 3[2], 6[5], 5[4], 2[1], 0[0]1[0],\ 3[2],\ 6[5],\ 5[4],\ 2[1],\ 0[0]이며, 합계는 0+2+5+4+1+0=120 + 2 + 5 + 4 + 1 + 0 = 12이다. 반대로 0,1,2,3,…0, 1, 2, 3, \dots처럼 앞으로만 나아간 소는 되돌아올 수 없다. 되돌아올 때 착지할 수 있는 칸(나아갈 때 밟은 칸의 바로 앞 칸)이 모두 이미 밟은 칸이기 때문이다.

참고: 소는 아무 점프도 하지 않기로 선택할 수도 있으며, 이때 얻는 금액은 00이다.

입력

  • 첫째 줄: 공백으로 구분된 두 정수 NN과 KK.
  • 2…N+12 \dots N+1번째 줄: i+1i+1번째 줄에는 정수 ViV_i 하나가 주어진다.

출력

  • 한 줄에 정수 하나: 소가 벌 수 있는 최대 금액.

예제2

  1. 예제 1

    입력
    6 3
    0
    1
    2
    -3
    4
    5
    
    예상 출력
    12
    
  2. 예제 2

    입력
    3 3
    5
    5
    5
    
    예상 출력
    15