만드는 중입니다

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

2단 라우터

시간 제한2초메모리 제한512 MB

요약
N과 연결 수 상한, 전력 상한이 주어질 때 수집기와 분배기를 두어 모든 조건을 만족하는 2단 라우터 그래프를 구성한다.
난이도

보통10점 중 5점

유형
그래프, 구현, 수학
정답자
아직 제출이 없습니다

문제

라우터는 노드와, 서로 다른 두 노드를 잇는 단방향 연결로 이루어진다.

  • 입력 노드 NN개, 번호는 11부터 NN까지
  • 출력 노드 NN개, 번호는 N+1N+1부터 2N2N까지
  • 내부 노드 KK개, 번호는 2N+12N+1부터 2N+K2N+K까지
  • 단방향 연결 MM개

노드 XX가 노드 YY로 데이터를 보낼 수 있다는 것은, X=YX = Y이거나, XX가 데이터를 보낼 수 있는 노드 ZZ가 있고 ZZ에서 YY로 가는 연결이 있다는 뜻이다. X≠YX \ne Y이고 XX가 YY로 데이터를 보낼 수 있을 때, XX에서 YY로 가는 데이터 경로는 A1=XA_1 = X, AL=YA_L = Y인 연결의 집합 {(A1,A2),(A2,A3),…,(AL−1,AL)}\{(A_1, A_2), (A_2, A_3), \dots, (A_{L-1}, A_L)\} (L≥2L \ge 2)이다.

라우터는 다음을 모두 만족할 때 제대로 동작한다.

  • 모든 입력 노드는 모든 출력 노드로 데이터를 보낼 수 있다.
  • 입력 노드는 자기 자신에게서만 데이터를 받는다.
  • 출력 노드는 자기 자신에게만 데이터를 보낸다.
  • X≠YX \ne Y이고 XX가 YY로 데이터를 보낼 수 있으면, YY는 XX로 데이터를 보낼 수 없다.
  • X≠YX \ne Y이고 XX가 YY로 데이터를 보낼 수 있으면, XX에서 YY로 가는 데이터 경로는 하나뿐이다. 특히 두 노드를 잇는 연결은 많아야 하나다.

노드 XX의 전력은 PX=INX×OUTXP_X = \mathrm{IN}_X \times \mathrm{OUT}_X로 정의한다. INX\mathrm{IN}_X는 XX로 데이터를 보낼 수 있는 입력 노드의 수, OUTX\mathrm{OUT}_X는 XX에게서 데이터를 받을 수 있는 출력 노드의 수다. 라우터의 최대 전력은 Pmax=max⁡(P1,P2,…,P2N+K)P_{max} = \max(P_1, P_2, \dots, P_{2N+K})이다.

NN, MlimM_{lim}, PlimP_{lim}이 주어진다. 출력 항목이 설명하는 방법으로 라우터를 만들어라. 이 라우터는 제대로 동작하고, 연결을 MlimM_{lim}개 이하로 쓰며, 최대 전력이 PlimP_{lim} 이하이고, 노드를 모두 합쳐 500000개 이하로 쓴다.

입력

첫째 줄에 정수 NN, MlimM_{lim}, PlimP_{lim}이 공백으로 구분되어 주어진다. (1≤N≤50001 \le N \le 5000, N≤Plim≤109N \le P_{lim} \le 10^9, 1≤Mlim≤5000001 \le M_{lim} \le 500000)

출력 항목의 라우터가 쓰는 연결의 수는 MlimM_{lim} 이하다.

출력

s=min⁡(N,⌊Plim/N⌋)s = \min(N, \lfloor P_{lim} / N \rfloor), g=⌈N/s⌉g = \lceil N / s \rceil이라고 하자. 라우터는 다음과 같이 만든다.

  • 입력 노드를 번호 순으로 ss개씩 묶어 gg개의 그룹으로 나눈다. 입력 노드 ii는 그룹 ⌈i/s⌉\lceil i / s \rceil에 속한다. 마지막 그룹은 ss개보다 적을 수 있다.
  • 출력 노드도 같은 방법으로 나눈다. 출력 노드 N+jN + j는 그룹 ⌈j/s⌉\lceil j / s \rceil에 속한다.
  • 수집 노드를 gg개 둔다. 그룹 cc의 수집 노드는 2N+c2N + c번이다.
  • 분배 노드를 gg개 둔다. 그룹 dd의 분배 노드는 2N+g+d2N + g + d번이다.
  • 입력 노드마다 자기 그룹의 수집 노드로 가는 연결을 만든다.
  • 모든 수집 노드에서 모든 분배 노드로 가는 연결을 만든다.
  • 그룹마다 그 그룹의 분배 노드에서 그 그룹의 출력 노드로 가는 연결을 만든다.

첫째 줄에 노드의 총 개수 Ntot=2N+2gN_{tot} = 2N + 2g와 연결의 수 M=2N+g2M = 2N + g^2를 공백으로 구분해 출력한다. 다음 MM개의 줄에는 노드 XX에서 노드 YY로 가는 연결을 한 줄에 하나씩 두 정수 XX, YY로 출력한다. 연결은 XX가 증가하는 순서로, XX가 같으면 YY가 증가하는 순서로 출력한다.

예제3

  1. 예제 1

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

    입력
    1 10 10
    
    예상 출력
    4 3
    1 3
    3 4
    4 2
    
  3. 예제 3

    입력
    4 100 8
    
    예상 출력
    12 12
    1 9
    2 9
    3 10
    4 10
    9 11
    9 12
    10 11
    10 12
    11 5
    11 6
    12 7
    12 8