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. Tcl与Design Compiler (四)——DC启动环境的设置

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 主要内容有: ·启动环 ...

  2. IDEA 编译等级与源代码等级不一致问题

    错误:Error:java: javacTask: source release 1.7 requires target release 1.7 原因:javac编译时指定的字节码版本低于了1.7版本 ...

  3. window.onload 和 $(document).ready(function(){})的区别

    这篇作为我的新的起点开始吧,发现年纪大了,记性就不好了,有些东西老是记了忘,忘了百度.在学一些新知识的时候也是这样的毛病,总是重复学习,这样效率真心差!所以决定开始认真写博客! 本来想封装一个预加载的 ...

  4. 关于SQL调优(Distinct 和 Exits)

    今天写了一段查询人员Id和人员编号的,由于需要从其他的表中取条件,因为人员表和另外的表对应的是一对多的关系,所以我使用了Distinct关键字对用户编号进行去重复,然后发现那个效率简直没法看,然后旁边 ...

  5. UNIX标准

    背景 人们在UNIX编程环境和C 程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用 程序在不同的UNIX操作系统版本之间进行移植相当容易,但是2 0 世 纪 80年代UNIX版本种类的剧增以 ...

  6. 老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览

    老李推荐:第5章2节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动流程概览   每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就 ...

  7. 4.熟悉Java基本类库系列——Java 正则表达式类库

    正则表达式语法结构图: Java正则表达式类库结构图: Java典型例子 1.String类 matches()方法 判断字符串是否符合特定正则表达式 @Test public void testRe ...

  8. Vuex随笔

    最近在项目中使用到了vuex,但是在配合vue使用时,也还是遇到了不少的问题,最终还是解决了问题,因此写一篇随笔来记录期间遇到的问题吧 项目概要: Vuex中所储存的的状态如下: Vue中:有一个ta ...

  9. activiti 一个流程的运转步骤 以请假流程为例

    ---为了加深对activiti的理解记忆,对自己做的一个流程进行自述.加强记忆 请假实例 一.设计请假的流程图以及流程文件,完善对应数据项,比如用户信息,请假单信息 --请假单 --流程图 --流程 ...

  10. css form表单样式清除

    开发项目中表单常用的清楚样式: 1.改变placeholder默认字体颜色 ::-webkit-input-placeholder{color: #333;} :-moz-placeholder{co ...