[刷题]Codeforces 746G - New Roads
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的更多相关文章
- [刷题]Codeforces 794C - Naming Company
http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...
- [刷题codeforces]650A.637A
650A Watchmen 637A Voting for Photos 点击查看原题 650A又是一个排序去重的问题,一定要注意数据范围用long long ,而且在写计算组合函数的时候注意也要用l ...
- [刷题codeforces]651B/651A
651B Beautiful Paintings 651A Joysticks 点击可查看原题 651B是一个排序题,只不过多了一步去重然后记录个数.每次筛一层,直到全为0.从这个题里学到一个正确姿势 ...
- [刷题]Codeforces 786A - Berzerk
http://codeforces.com/problemset/problem/786/A Description Rick and Morty are playing their own vers ...
- CF刷题-Codeforces Round #481-G. Petya's Exams
题目链接:https://codeforces.com/contest/978/problem/G 题目大意:n天m门考试,每门考试给定三个条件,分别为:1.可以开始复习的日期.2.考试日期.3.必须 ...
- CF刷题-Codeforces Round #481-F. Mentors
题目链接:https://codeforces.com/contest/978/problem/F 题目大意: n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值 ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- Codeforces 746G New Roads (构造)
G. New Roads ...
- [刷题]Codeforces 785D - Anton and School - 2
Description As you probably know, Anton goes to school. One of the school subjects that Anton studie ...
随机推荐
- PyQt QListWidget修改列表项item的行高
百度,谷歌之后都说用setHintSize(self,QCore.QSize(width,height)),然并卵,后来用qss修改就可以了,具体用法如下 # emaillist是我给QListWid ...
- vuejs子组件向父组件传递数据
子组件通过$emit方法向父组件发送数据,子组件在父组件的模板中,通过自定义事件接收到数据,并通过自定义函数操作数据 <!DOCTYPE html> <html lang=" ...
- GNU/Linux与开源文化的那些人和事
一.计算机的发明 世上本无路,走的人多了,就有了路.世上本无计算机,琢磨的人多了--没有计算机,一切无从谈起. 三个人对计算机的发明功不可没,居功至伟.阿兰·图灵(Alan Mathison Tur ...
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- 使用assets目录来实现插件机制
/** * 管理接口. * @author jevan * @version 1.0 at 2013-12-6 * */ public interface IManage { /** * 注册平台接口 ...
- error C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard,set _CRT_NON_CONFORMING_SWPRINT
在VS2013上运行一个简单程序时,出现了error C4996: 'swprintf': swprintf has been changed to conform with the ISO C st ...
- Entity Framework细节追踪
小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...
- Python with
简介 在编程中会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作.例如,文件读写后需要关闭,数据库读写完毕需要关闭连接,资 ...
- 使用PCA + KNN对MNIST数据集进行手写数字识别
首先引入需要的包 %matplotlib inline import numpy as np import scipy as sp import pandas as pd import matplot ...
- CGLIB和JDK代理
需要的架包:在spring中提供对CGLIB的支持 一.JDK的动态代理 1.接口IUserDao package cn.itcast.spring3.jdk.proxy; public interf ...