만드는 중입니다

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

MatKor⊕AlKor=MatAl\mathtt{MatKor} \oplus \mathtt{AlKor} = \mathtt{MatAl}

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

요약
각 가열은 가열한 조각에서 멀어질수록 1씩 줄어드는 온도 상승을 만듭니다. 이웃한 조각의 온도 차이를 M 이하로 만드는 최소 가열 횟수와 조각별 가열 횟수를 구합니다.
난이도

어려움10점 중 8점

유형
누적 합, 그리디, 배열
정답자
아직 제출이 없습니다

문제

이번 대회인 제6회 MatKor Cup은 고려대학교 정보보호학부 동아리 MatKor와 사이버국방학과 동아리 AlKor가 함께 주최한다. 7회 대회부터는 대회 명칭을 살짝 바꿔 <제7회 MatKor&AlKor(MatAl) Cup>으로 열릴 예정이다.

이번 대회부터 MatKor와 AlKor가 공동으로 주최하며, 다음 대회 이름이 MatAl Cup인 만큼 두 동아리는 금속 현판(Metal Plate)을 만들려고 한다. 이 현판은 길이가 11인 금속 조각 NN개를 일렬로 이어 붙인 직선형이다. 11번부터 NN번까지 차례로 이어 붙였을 때, ii번 금속 조각은 처음에 온도 AiA_i를 가진다.

온도 차이가 크게 나는 두 조각이 이웃해 있으면 현판이 쪼개질 수 있다는 사실을 알게 된 민재는, 금속 조각을 가열해 이웃한 두 조각의 온도 차이를 MM 이하로 만들려고 한다. 민재는 금속 조각을 한 번 가열할 때 다음 행동을 순서대로 한다.

  • 가열할 금속 조각의 번호 ii를 고른다.
  • ii번째 금속 조각의 온도를 NN만큼 올리기 위해 가열한다. 이때 현판은 다음과 같이 가열된다.
    • 모든 조각의 온도가 올라가는데, 가열한 위치에서 멀어진 칸 수만큼 올라가는 온도가 줄어든다. 수식으로 나타내면 다음과 같다.
    • 모든 정수 1≤j≤N1\le j\le N에 대해, jj번째 금속 조각의 온도는 N−∣i−j∣N-|i-j|만큼 올라간다.

민재는 행동 횟수를 최소로 하여 이웃한 두 금속 조각의 온도 차이를 MM 이하로 만들고자 한다. 즉, 모든 정수 1≤i<N1\le i<N에 대하여 ∣Ai−Ai+1∣≤M|A_i-A_{i+1}|\le M을 만족해야 한다.

민재의 최소 행동 횟수와 실제 행동을 찾아보자.

입력

첫 번째 줄에 금속 현판의 길이 NN(1≤N≤1061\le N\le 10^6)과 이웃한 두 조각의 최대 온도 차이 목표 MM(0≤M≤1090\le M\le 10^9)이 공백으로 구분되어 주어진다.

두 번째 줄에는 현판을 이루는 각 금속 조각의 초기 온도 A1,A2,⋯ ,ANA_1, A_2, \cdots, A_N(1≤Ai≤1091\le A_i\le 10^9)이 공백으로 구분되어 주어진다.

출력

첫 번째 줄에 목표를 달성하기 위한 최소 행동 횟수 LL을 출력한다. 불가능하면 -1을 출력한다.

목표를 달성할 수 있다면 두 번째 줄에 최소 횟수로 가열할 때 ii번째 금속 조각을 가열하는 횟수를 순서대로 공백으로 구분하여 출력한다. 가능한 방법이 여러 가지이면 아무거나 출력해도 된다.

예제4

  1. 예제 1

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

    입력
    3 1
    1 3 6
    
    예상 출력
    2
    2 0 0
    
  3. 예제 3

    입력
    5 0
    1 3 5 7 9
    
    예상 출력
    2
    2 0 0 0 0
    
  4. 예제 4

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