Algorithm


E. Tree Constructing
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given three integers nd and k.

Your task is to construct an undirected tree on n vertices with diameter d and degree of each vertex at most k, or say that it is impossible.

An undirected tree is a connected undirected graph with n1�−1 edges.

Diameter of a tree is the maximum length of a simple path (a path in which each vertex appears at most once) between all pairs of vertices of this tree.

Degree of a vertex is the number of edges incident to this vertex (i.e. for a vertex u it is the number of edges (u,v)(�,�) that belong to the tree, where v is any other vertex of a tree).

Input

The first line of the input contains three integers nd and k (1n,d,k41051≤�,�,�≤4⋅105).

Output

If there is no tree satisfying the conditions above, print only one word "NO" (without quotes).

Otherwise in the first line print "YES" (without quotes), and then print n1�−1 lines describing edges of a tree satisfying the conditions above. Vertices of the tree must be numbered from 11 to n. You can print edges and vertices connected by an edge in any order. If there are multiple answers, print any of them.1

Examples
input
Copy
6 3 3
output
Copy
YES
3 1
4 1
1 2
5 2
2 6
input
Copy
6 2 3
output
Copy
NO
input
Copy
10 4 3
output
Copy
YES
2 9
2 10
10 3
3 1
6 10
8 2
4 3
5 6
6 7
input
Copy
8 5 3
output
Copy
YES
2 5
7 2
3 7
3 1
1 6
8 7
4 3

 



 

Code Examples

#1 Code Example with C++ Programming

Code - C++ Programming

#include <bits/stdc++.h>

using namespace std;

int const N = 4e5 + 1;
int n, d, k, fr[N], p[N];
vector<pair<int, int> > edges;

int main() {
#ifndef ONLINE_JUDGE
  freopen("in", "r", stdin);
#endif

  scanf("%d %d %d", &n, &d, &k);

  if(n < d + 1) {
    puts("NO");
    return 0;
  }

  for(int i = 1; i <= n; ++i)
    fr[i] = k;

  int s = 1, e = d + 1;

  for(int i = 1; i < e; ++i) {
    if(fr[i] > 0 && fr[i + 1] > 0) {
      edges.push_back({i, i + 1});
      --fr[i], --fr[i + 1];
      p[i] = max(i - s, e - i);
    } else {
      puts("NO");
      return 0;
    }
  }

  int cnt = e;
  for(int i = s + 1, cur, node; i < e; ++i) {
    cur = min(i - s, e - i), node = i;
    while(cnt < n && cur > 0 && fr[node] > 0) {
      if(fr[cnt + 1] < 1) {
        puts("NO");
        return 0;
      }

      edges.push_back({node, ++cnt});
      --fr[node], --fr[cnt];
      --cur;
      p[cnt] = p[node] + 1;
      node = cnt;
    }
  }

  for(int i = 1; i <= n; ++i) {
    if(i == s || i == e || p[i] == d)
      continue;
    while(cnt < n && fr[i] > 0) {
      if(cnt + 1 == i || fr[cnt + 1] < 1)
        break;
      edges.push_back({i, ++cnt});
      --fr[i], --fr[cnt];
      p[cnt] = p[i] + 1;
    }
  }

  if(edges.size() != n - 1 && cnt  <  n) {
    puts("NO");
    return 0;
  }

  puts("YES");
  for(int i = 0; i < edges.size(); ++i)
    printf("%d %d\n", edges[i].first, edges[i].second>;

  return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
6 3 3

Output

x
+
cmd
YES
3 1
4 1
1 2
5 2
2 6
Advertisements

Demonstration


Codeforces Solution-E. Tree Constructing-Solution in C, C++, Java, Python

Previous
Codeforces solution 1080-B-B. Margarite and the best present codeforces solution
Next
CodeChef solution DETSCORE - Determine the Score CodeChef solution C,C+