Description

There are n cities in Berland, each of them has a unique id — an integer from 1 to n, the capital is the one with id 1. 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, where t 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 distance i 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 exactly k 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 and k (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 integers a1, a2, …, at (1 ≤ ai < n), the i-th number is the number of cities which should be at the distance i from the capital. It is guaranteed that the sum of all the values ai equals n - 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 next n - 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 id 1.

Examples

input
7 3 3
2 3 1 output
7
1 3
2 1
2 6
2 4
7 4
3 5 input
14 5 6
4 4 2 2 1 output
14
3 1
1 4
11 6
1 2
10 13
6 10
10 12
14 12
8 4
5 1
3 7
2 6
5 9 input
3 1 1
2 output
-1

Key

题意:给一棵一共有n个结点(包括根节点)的树,一共有t+1层。除第一层只有一个根节点外,给出了其他每层的节点数。已知有k个结点没有子节点,要求用n−1个树枝连接所有结点,给出一种可能的连法。

可能的连法(可能)有很多,只要输出随便其中一个即可。

思路:先遍历一遍所有层,求出可行的最大最小的maxk、mink。如果题目给的k不在此范围内,则说明不能组成符合要求的树。这是唯二输出“-1”的情况。

求能产生的最少的无儿子结点:



求能产生的最多的无儿子结点:

令needk=k−mink,则除去一定有的无儿子结点,还有needk个无儿子结点需要手动产生。

然后遍历每一层,自己做出needk个无儿子结点即可。无需建立树,边遍历边输出。

第一次写出了最后一题,开心的一匹(ง •̀▿•́)ง。虽然写了就知道并不难。。。

Code

#include<cstdio>
int n, t, k;
int arr[200010]; int main()
{
scanf("%d%d%d", &n, &t, &k);
arr[0] = 1;
for (int i = 1;i <= t;++i) {
scanf("%d", arr + i);
}
arr[t + 1] = 0;
int mink = 0;
int maxk = 0;
for (int i = 0;i <= t;++i) {
maxk += arr[i] - 1;
if (arr[i] > arr[i + 1])
mink += arr[i] - arr[i + 1];
}
++maxk;
if (mink > k || maxk < k) {
printf("-1");
return 0;
}
printf("%d\n", n);
int needk = k - mink; // dead-ends that needed to created by myself
int nown = 1;
for (int i = 0;i != t;++i) {
int nextn = nown + arr[i];
if (!needk) {
if (arr[i + 1] >= arr[i]) {
int err = arr[i + 1] - arr[i] + 1;
int rem = arr[i] - 1;
for (int j = 0;j != err;++j) {
printf("%d %d\n", nown, nextn++);
}
++nown;
for (int j = 0;j != rem;++j) {
printf("%d %d\n", nown++, nextn++);
}
}
else { // arr[i + 1] < arr[i]
for (int j = 0;j != arr[i + 1];++j) {
printf("%d %d\n", nown++, nextn++);
}
nown += arr[i] - arr[i + 1];
}
}
else {
if (arr[i + 1] >= arr[i]) {
int nextnown = nextn;
int nextnextn = nextn + arr[i + 1];
int err = arr[i + 1] - arr[i] + 1;
for (int j = 0;j != err;++j) {
printf("%d %d\n", nown, nextn++);
}
while (nextn != nextnextn) {
if (!needk) break;
--needk;
printf("%d %d\n", nown, nextn++);
}
++nown;
while (nextn != nextnextn) {
printf("%d %d\n", nown++, nextn++);
}
nown = nextnown;
}
else { // arr[i + 1] < arr[i]
int nextnown = nextn;
int nextnextn = nextn + arr[i + 1];
printf("%d %d\n", nown, nextn++);
while (nextn != nextnextn) {
if (!needk) break;
--needk;
printf("%d %d\n", nown, nextn++);
}
++nown;
while (nextn != nextnextn) {
printf("%d %d\n", nown++, nextn++);
}
nown = nextnown;
}
}
}
return 0;
}

[刷题]Codeforces 746G - New Roads的更多相关文章

  1. [刷题]Codeforces 794C - Naming Company

    http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...

  2. [刷题codeforces]650A.637A

    650A Watchmen 637A Voting for Photos 点击查看原题 650A又是一个排序去重的问题,一定要注意数据范围用long long ,而且在写计算组合函数的时候注意也要用l ...

  3. [刷题codeforces]651B/651A

    651B Beautiful Paintings 651A Joysticks 点击可查看原题 651B是一个排序题,只不过多了一步去重然后记录个数.每次筛一层,直到全为0.从这个题里学到一个正确姿势 ...

  4. [刷题]Codeforces 786A - Berzerk

    http://codeforces.com/problemset/problem/786/A Description Rick and Morty are playing their own vers ...

  5. CF刷题-Codeforces Round #481-G. Petya's Exams

    题目链接:https://codeforces.com/contest/978/problem/G 题目大意:n天m门考试,每门考试给定三个条件,分别为:1.可以开始复习的日期.2.考试日期.3.必须 ...

  6. CF刷题-Codeforces Round #481-F. Mentors

    题目链接:https://codeforces.com/contest/978/problem/F 题目大意: n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值 ...

  7. CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression

    题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...

  8. Codeforces 746G New Roads (构造)

                                                                            G. New Roads                 ...

  9. [刷题]Codeforces 785D - Anton and School - 2

    Description As you probably know, Anton goes to school. One of the school subjects that Anton studie ...

随机推荐

  1. vmware克隆之后网卡起不来的问题

    问题: 克隆一台主机之后,改主机的网卡起不来,只有一个本地的回环地址网卡. 使用如下的命令都无效. /etc/init.d/network restart ifup eth0 原因: 这一vmware ...

  2. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  3. VC++中经常出现的内存泄露和指针问题

    要养成良好的编程习惯,每次用new开辟的新空间马上先写好释放语句delete.指针在程序中往往有很多细节问题,比如1.指针作为返回值,某个分支中进行赋值返回,另一个分支却没有值.2.指针作为函数参数传 ...

  4. css2.1实现圆角边框

    虽然css3的border-radius实现圆角很简单,但是我还是认为css2.1中好多技术还是很值得学习的,我也是后来才知道这就是传说中的滑动门技术.脑洞大开啊 附上demo <!DOCTYP ...

  5. 20155214 2016-2017-2 《Java程序设计》第5周学习总结

    20155214 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 1.错误会被包装为可抛出的对象,继承自java.lang.Throwable类. 2.可以利 ...

  6. 20155206 2016-2017-2 《Java程序设计》第5周学习总结

    20155206 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信 ...

  7. [笔记]Learning to Rank算法介绍:RankNet,LambdaRank,LambdaMart

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  8. mac下CSV文件用FileReader、FileWriter读写乱码

      先说下windows的excel文件搬到mac下打开为什么会显示乱码.    在win下,excel采用GBK编码,1个汉字是存为2个字节,而mac下各种软件广泛默认使用UTF-8编码方式,如在e ...

  9. 在ASP.NET MVC4中配置Castle

    ---恢复内容开始--- Castle是针对.NET平台的一个非常优秀的开源项目,重点是开源的哦.它在NHibernate的基础上进一步封装,其原理基本与NHibernate相同,但它较好地解决NHi ...

  10. Linux命令之_Cut(转)

    linux之cut用法   cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn ...