트리 만들기

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

요약
정점 N개의 트리 중 거리가 3인 순서 없는 쌍이 정확히 K개인 트리가 존재하는지 판별하고, 존재하면 그런 트리 하나를 출력한다.
난이도

어려움10점 중 8점

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

문제

거리가 33만큼 떨어진 순서 없는 정점 쌍을 정확히 KK개 찾을 수 있는, 정점의 개수가 NN개인 트리를 구성할 수 있는지 판별하라. 만약 구성할 수 있다면, 조건을 만족하는 트리를 아무거나 하나 출력하라.

여기서 두 정점 사이의 거리란, 한 정점과 다른 정점을 잇는 유일한 단순 경로 위의 간선의 개수로 정의된다.

입력

첫 번째 줄에 트리의 정점 개수 NN과 문제의 정수 KK가 공백으로 구분되어 주어진다. (2≤N≤500,0002\le N\le 500\\, 000, 0≤K≤N(N−1)20\le K\le\frac{N(N-1)}{2})

출력

첫 번째 줄에 조건을 만족하는 트리를 구성할 수 있는지 여부를 출력한다. 구성할 수 있다면 YES를, 없다면 NO를 출력한다. 답이 YES인 경우, 두 번째 줄부터 N−1N-1개의 줄에 간선의 양 끝 정점의 번호를 공백으로 구분해서 출력한다. 정점의 번호는 11 이상 NN 이하의 정수여야 한다.

힌트

입력으로 주어지는 KK의 값이 32비트 정수 변수가 표현할 수 있는 범위를 넘을 수 있다. 64비트 정수 변수(C++의 경우 long long type)를 사용할 것을 권장한다. 또한 트리란 NN개의 정점과 N−1N-1개의 간선을 가지는 무방향 연결 그래프이다.

예제2

  1. 예제 1

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

    입력
    6 4
    
    예상 출력
    YES
    1 2
    1 3
    3 4
    3 5
    5 6