마라톤 아이스하키

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

요약
정해진 탐욕 순서로 각 선수의 출전 시간을 배정한 뒤, 그 결과로 생기는 순환 블록을 명시적인 교체 목록으로 바꾼다.
난이도

보통10점 중 7점

유형
그리디, 정렬, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

마라톤 아이스하키 경기는 MM분 동안 이어진다. 경기의 매 분마다 안테 팀에서 정확히 여섯 명이 빙판 위에 있다.

안테는 대회에 선수 NN명을 데려왔다. ii번 선수의 능력치는 KiK_i, 체력은 IiI_i이다. 체력은 그 선수가 경기 내내 빙판에서 보낼 수 있는 총 시간(분)이고, 이 시간이 연속일 필요는 없다. 어떤 선수가 XX분을 뛰고 벤치에서 쉰 다음 다시 YY분을 뛰면 체력을 X+YX + Y만큼 쓴 것이다. 어떤 선수도 자기 체력보다 많은 시간을 빙판에서 보낼 수 없다.

교체는 연속한 두 분 사이에서만 일어나고 1분 안에서는 일어나지 않는다. 같은 순간에 여러 명을 한꺼번에 교체할 수 있다. 어떤 순간에 들어온 선수가 같은 순간에 나갈 수는 없고, 나간 선수가 같은 순간에 다시 들어올 수도 없다.

한 분 동안 팀의 능력치는 그 분에 빙판에 있는 여섯 명의 능력치 합이다. ZZ는 이 값을 MM분 전체에 대해 더한 값이다. 예를 들어 경기가 3분 동안 이어지고 팀의 능력치가 첫 분에 15, 둘째 분에 12, 셋째 분에 14라면 Z=15+12+14=41Z = 15 + 12 + 14 = 41이다.

입력은 항상 매 분 여섯 명을 빙판에 세우는 출전 계획이 하나 이상 존재하도록 주어진다. 즉 I1+I2+⋯+IN≥6MI_1 + I_2 + \dots + I_N \ge 6M이다.

안테가 얻을 수 있는 가장 큰 ZZ와 그 ZZ를 만드는 출전 계획을 출력한다. 가장 큰 ZZ를 만드는 계획은 여러 가지이므로, 출력 항목에서 그중 하나를 정확히 정해 둔다.

마라톤 아이스하키에는 골리가 없다.

입력

첫 줄에 경기 길이 MM과 안테가 데려온 선수 수 NN이 주어진다 (1≤M≤500 0001 \le M \le 500\,000, 6≤N≤500 0006 \le N \le 500\,000).

다음 NN개 줄에는 선수 한 명의 능력치 KiK_i와 체력 IiI_i가 주어진다 (1≤Ki≤100 0001 \le K_i \le 100\,000, 1≤Ii≤M1 \le I_i \le M). 선수 번호는 입력에 주어진 순서대로 1번부터 NN번까지이다.

출력

출전 계획은 아래 규칙으로 하나만 정해지므로, 정답으로 인정하는 출력도 하나뿐이다.

선수를 능력치가 큰 순서로 정렬하고, 능력치가 같으면 번호가 작은 선수를 앞에 둔다. 이 순서대로 출전 시간을 나눠 준다. 앞에서부터 각 선수는 자기 체력과 아직 배정하지 않은 시간 중 작은 값을 받고, 전체로는 6M6M분을 배정한다. 6M6M분을 모두 배정하면 남은 선수는 0분을 받는다. 이 배정이 가장 큰 ZZ를 만들며, ZZ는 각 선수의 KiK_i에 그 선수의 출전 시간을 곱해 모두 더한 값이다.

이제 1번부터 6M6M번까지 번호를 붙인 칸 한 줄에 계획을 배치한다. 출전 시간이 1분 이상인 선수를 위 정렬 순서대로 놓고, 1번 칸부터 빈칸 없이 각 선수에게 출전 시간만큼 연속한 칸을 준다. cc번 칸은 ((c−1) mod M)+1((c - 1) \bmod M) + 1번째 분에 해당한다. 모든 출전 시간이 MM 이하이므로 한 분에 해당하는 여섯 칸에는 서로 다른 여섯 선수가 들어가고, 이들이 그 분에 빙판에 있는 선수이다.

첫 줄에 ZZ를 출력한다.

둘째 줄에 1번째 분에 빙판에 있는 여섯 선수의 번호를 번호가 작은 순서로 출력한다.

셋째 줄에 뒤이어 출력할 교체 줄의 개수 BB를 출력한다.

다음 BB개 줄에는 각각 세 정수 XX, AA, CC를 출력한다. 경기 시작 후 XX분이 지난 순간에 AA번 선수가 빙판에서 나가고 CC번 선수가 들어온다는 뜻이다.

교체 줄은 다음과 같이 만든다. X=1X = 1부터 M−1M - 1까지 각각에 대해, XX번째 분에는 빙판에 있고 X+1X + 1번째 분에는 없는 선수를 번호가 작은 순서로 모아 목록 LL을 만들고, X+1X + 1번째 분에는 있고 XX번째 분에는 없는 선수를 같은 방식으로 모아 목록 EE를 만든다. 두 목록의 길이는 같다. 같은 자리끼리 짝지어 한 줄씩 출력하고, XX가 작은 것부터 출력한다.

예제3

  1. 예제 1

    입력
    200 6
    3 200
    4 200
    5 200
    6 200
    7 200
    8 200
    
    예상 출력
    6600
    1 2 3 4 5 6
    0
    
  2. 예제 2

    입력
    9 9
    10 3
    9 3
    13 9
    5 3
    15 9
    100 9
    3 6
    2 6
    1 6
    
    예상 출력
    1260
    1 3 5 6 7 8
    4
    3 1 2
    3 8 9
    6 2 4
    6 7 8
    
  3. 예제 3

    입력
    3 9
    100 3
    100 3
    100 3
    100 3
    100 2
    100 1
    50 1
    30 2
    1 1
    
    예상 출력
    1610
    1 2 3 4 5 7
    2
    1 7 8
    2 5 6