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. win7禁用离开模式,让笔记本卡盖后进入休眠

    进入注册列表项 将HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerPower,中的“AwayModeEnabled”删除即 ...

  2. 深入理解ajax系列第九篇——jQuery中的ajax

    前面的话 jQuery提供了一些日常开发中需要的快捷操作,例如load.ajax.get和post等,使用jQuery开发ajax将变得极其简单.这样开发人员就可以将程序开发集中在业务和用户体验上,而 ...

  3. 多线程CountDownLatch和Join

    如果现在有五个线程A.B.C.D.E,请问如何用E线程用于统计A.B.C.D四个线程的结果? 题意需要用E线程统计A.B.C.D四个线程,也就是说E线程必须要等到前面四个线程运行结束之后才能执行.那么 ...

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

    20155323 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 异常处理 提供两种异常处理机制:捕获异常和声明抛弃异常. 捕获异常:在Java程序运行过程中 ...

  5. number问题

    Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one ...

  6. Java面试题:写代码使得分别出现StackOverflowError和OutOfMemoryError

    转载自:http://www.cnblogs.com/xudong-bupt/p/3360206.html 今天做了个笔试,这是其中的一道题目:写代码使得分别出现StackOverflowError和 ...

  7. hiveF 函数解析时间问题

    #!/bin/bashsource /etc/profileupdatetime=`date --date='0 days ago' +"%Y-%m-%d %H:%M:%S"`ec ...

  8. shiro基础学习(三)—shiro授权

    一.入门程序 1.授权流程        2.授权的三种方式 (1)编程式: 通过写if/else 授权代码块完成. Subject subject = SecurityUtils.getSubjec ...

  9. 浏览器特性检测插件Feature.js

    <script src="js/feature.js"></script> if (feature.webGL) { console.log("你 ...

  10. TCP/IP笔记(七)TCP详解

    TCP的特点及其目的 为了通过数据包实现可靠性传输,需要考虑很多事情,例如数据的破坏.丢包.重复记忆分片顺序混乱等问题.如不能解决这些问题,也就无从谈起可靠传输. TCP通过检验和.序列号.确认应答. ...