G. New Roads
                                                                                               time limit per test

2 seconds

                                                                                           memory limit per test

256 megabytes

                                                                                                          input

standard input

                                                                                                          output

standard output

There are n cities in Berland, each of them has a unique id — an integer from1 ton, the capital is the one with id1.
Now there is a serious problem in Berland with roads — there are no roads.

That is why there was a decision to build n - 1 roads so that there will be exactly one simple path between each pair of cities.

In the construction plan t integers
a1, a2, ..., at were stated, wheret equals to the distance from the capital to the
most distant city, concerning new roads.ai equals the number of cities which should be at the distancei from the capital. The distance between
two cities is the number of roads one has to pass on the way from one city to another.

Also, it was decided that among all the cities except the capital there should be exactlyk cities with exactly one road going from each of them. Such cities are dead-ends and can't be economically attractive. In calculation
of these cities the capital is not taken into consideration regardless of the number of roads from it.

Your task is to offer a plan of road's construction which satisfies all the described conditions or to inform that it is impossible.

Input

The first line contains three positive numbers n,t andk (2 ≤ n ≤ 2·105,1 ≤ t, k < n) —
the distance to the most distant city from the capital and the number of cities which should be dead-ends (the capital in this number is not taken into consideration).

The second line contains a sequence of t integersa1, a2, ..., at
(1 ≤ ai < n), thei-th number is the number of cities which should be at the distancei from
the capital. It is guaranteed that the sum of all the valuesai equalsn - 1.

Output

If it is impossible to built roads which satisfy all conditions, print
-1.

Otherwise, in the first line print one integer n — the number of cities in Berland. In the each of the nextn - 1 line print two integers — the ids of cities that are connected
by a road. Each road should be printed exactly once. You can print the roads and the cities connected by a road in any order.

If there are multiple answers, print any of them. Remember that the capital has id1.

Examples
Input
  1. 7 3 3
  2. 2 3 1
Output
  1. 7
  2. 1 3
  3. 2 1
  4. 2 6
  5. 2 4
  6. 7 4
  7. 3 5
Input
  1. 14 5 6
  2. 4 4 2 2 1
Output
  1. 14
  2. 3 1
  3. 1 4
  4. 11 6
  5. 1 2
  6. 10 13
  7. 6 10
  8. 10 12
  9. 14 12
  10. 8 4
  11. 5 1
  12. 3 7
  13. 2 6
  14. 5 9
Input
  1. 3 1 1
  2. 2
Output
  1. -1

在构造树的时候,先把树的主链确定,再确定哪些节点为叶子节点(显然深度最大的那些点一定是叶子结点,且根节点一定不是叶子结点因为n≥2),哪些不是叶子节点。

当叶子节点数目不够时,考虑那些不一定是叶子节点的节点(即深度不是最大值并且不是树的主链的成员的节点),把他作为深度大于他们的结点的父亲即可。这样该结点就变成非叶子结点了。

当非叶子结点个数大于那些可以变成非叶子结点的个数时,无解。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define REP(i,n) for(int i(0); i < (n); ++i)
  6. #define rep(i,a,b) for(int i(a); i <= (b); ++i)
  7. #define PB push_back
  8.  
  9. const int N = 200000 + 10;
  10. vector <int> v[N];
  11. int fa[N], a[N], n, la, leaf, cnt, l;
  12.  
  13. int main(){
  14.  
  15. scanf("%d%d%d", &n, &la, &leaf);
  16. rep(i, 1, la) scanf("%d", a + i);a[0] = 1;
  17. if ((a[la] > leaf) || (n - la < leaf) || (n < leaf)){ puts("-1"); return 0;}
  18.  
  19. int sum = 1; rep(i, 1, la) sum += a[i];
  20. if (sum != n){ puts("-1"); return 0;}
  21. cnt = 0; rep(i, 0, la) rep(j, 1, a[i]) v[i].PB(++cnt);
  22.  
  23. REP(i, a[1]) fa[v[1][i]] = 1;
  24. rep(i, 2, la) fa[v[i][0]] = v[i - 1][0];
  25. l = n - leaf - la;
  26.  
  27. rep(i, 2, la){
  28. rep(j, 1, a[i] - 1) if (l && j <= a[i - 1] - 1) fa[v[i][j]] = v[i - 1][j], --l;
  29. else fa[v[i][j]] = v[i - 1][0];
  30. }
  31.  
  32. if (l) {puts("-1"); return 0;}
  33.  
  34. printf("%d\n", n);
  35. rep(i, 2, n) printf("%d %d\n", fa[i], i);
  36.  
  37. return 0;
  38.  
  39. }

Codeforces 746G(构造)的更多相关文章

  1. New Roads CodeForces - 746G (树,构造)

    大意:构造n结点树, 高度$i$的结点有$a_i$个, 且叶子有k个. 先确定主链, 然后贪心放其余节点. #include <iostream> #include <algorit ...

  2. Codeforces 746G New Roads (构造)

                                                                            G. New Roads                 ...

  3. 【codeforces 746G】New Roads

    [题目链接]:http://codeforces.com/problemset/problem/746/G [题意] 给你3个数字n,t,k; 分别表示一棵树有n个点; 这棵树的深度t,以及叶子节点的 ...

  4. B - Save the problem! CodeForces - 867B 构造题

    B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...

  5. Johnny Solving CodeForces - 1103C (构造,图论)

    大意: 无向图, 无重边自环, 每个点度数>=3, 要求完成下面任意一个任务 找一条结点数不少于n/k的简单路径 找k个简单环, 每个环结点数小于n/k, 且不为3的倍数, 且每个环有一个特殊点 ...

  6. Codeforces 1188A 构造

    题意:给你一颗树,树的边权都是偶数,并且边权各不相同.你可以选择树的两个叶子结点,并且把两个叶子结点之间的路径加上一个值(可以为负数),问是否可以通过这种操作构造出这颗树?如果可以,输出构造方案.初始 ...

  7. C - Long Beautiful Integer codeforces 1269C 构造

    题解: 这里的m一定是等于n的,n为数最大为n个9,这n个9一定满足条件,根据题目意思,前k个一定是和原序列前k个相等,因此如果说我们构造出来的大于等于原序列,直接输出就可以了,否则,由于后m-k个一 ...

  8. [刷题]Codeforces 746G - New Roads

    Description There are n cities in Berland, each of them has a unique id - an integer from 1 to n, th ...

  9. Dividing the numbers CodeForces - 899C (构造)

    大意: 求将[1,n]划分成两个集合, 且两集合的和的差尽量小. 和/2为偶数最小差一定为0, 和/2为奇数一定为1. 显然可以通过某个前缀和删去一个数得到. #include <iostrea ...

随机推荐

  1. Kubernetes添加带Quota限额的CephFS StorageClass

    1. 在Ceph上为Kubernetes创建一个文件系统 # ceph osd pool create cephfs_data # ceph osd pool create cephfs_metada ...

  2. P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  3. 使用code::blocks编译windows的dll链接库

    因为机子上没有安装Visual Studio,所以找到了一种通过code::blocks编译dll的方式,踩到的坑是code::blocks默认的compiler是32位的,这样编译出的dll也是32 ...

  4. ajax跨域请求的处理

    跨域的情形有很多种,网上有人给出了一份表格, 表格中标识为”不允许”通信的情况都属于跨域.实际网络服务中需要跨域的情况确实存在,于是开发者们提供了一种解决方案,就是使用jsonp格式进行数据交互,它不 ...

  5. loj2053 「HNOI2016」大数

    ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...

  6. 使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法

    由于园子里有不少用户在使用dnspod,我们觉得有必要将这两天blogjava.net域名在dsnpod遇到的奇特问题分享一下,以免再有人踩着这个坑. 12月11日,我们登录到dnspod的后台时,大 ...

  7. MOCTF-火眼金睛

    MOCTF-火眼金睛 http://119.23.73.3:5001/web10/ 把这个题目当作python爬虫来练习. 首先要获取到文本框里面的全部信息, import requests impo ...

  8. Mac进行一些操作时提醒Operation not permitted的完美解决

    Mac版本10.14.5 ,向下向上都行: 1.关闭mac的安全机制,首先可以在正常模式下,输入 csrutil status 命令,查看mac安全机制是否开启. 2.如果 Protection st ...

  9. c#委托使用

    public class StepArgs : EventArgs { public int m_IMax = 0; public int m_IStep = 0; public string m_S ...

  10. POJ-1087 二分图匹配,最大流。

                                                      A Plug for UNIX 题意很迷,不过很水. 题意:一个房间有m个插座,每个插座有一个型号, ...