Codeforces 746G(构造)
2 seconds
256 megabytes
standard input
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.
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.
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.
7 3 3
2 3 1
7
1 3
2 1
2 6
2 4
7 4
3 5
14 5 6
4 4 2 2 1
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
3 1 1
2
-1
在构造树的时候,先把树的主链确定,再确定哪些节点为叶子节点(显然深度最大的那些点一定是叶子结点,且根节点一定不是叶子结点因为n≥2),哪些不是叶子节点。
当叶子节点数目不够时,考虑那些不一定是叶子节点的节点(即深度不是最大值并且不是树的主链的成员的节点),把他作为深度大于他们的结点的父亲即可。这样该结点就变成非叶子结点了。
当非叶子结点个数大于那些可以变成非叶子结点的个数时,无解。
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i(0); i < (n); ++i)
#define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define PB push_back const int N = 200000 + 10;
vector <int> v[N];
int fa[N], a[N], n, la, leaf, cnt, l; int main(){ scanf("%d%d%d", &n, &la, &leaf);
rep(i, 1, la) scanf("%d", a + i);a[0] = 1;
if ((a[la] > leaf) || (n - la < leaf) || (n < leaf)){ puts("-1"); return 0;} int sum = 1; rep(i, 1, la) sum += a[i];
if (sum != n){ puts("-1"); return 0;}
cnt = 0; rep(i, 0, la) rep(j, 1, a[i]) v[i].PB(++cnt); REP(i, a[1]) fa[v[1][i]] = 1;
rep(i, 2, la) fa[v[i][0]] = v[i - 1][0];
l = n - leaf - la; rep(i, 2, la){
rep(j, 1, a[i] - 1) if (l && j <= a[i - 1] - 1) fa[v[i][j]] = v[i - 1][j], --l;
else fa[v[i][j]] = v[i - 1][0];
} if (l) {puts("-1"); return 0;} printf("%d\n", n);
rep(i, 2, n) printf("%d %d\n", fa[i], i); return 0; }
Codeforces 746G(构造)的更多相关文章
- New Roads CodeForces - 746G (树,构造)
大意:构造n结点树, 高度$i$的结点有$a_i$个, 且叶子有k个. 先确定主链, 然后贪心放其余节点. #include <iostream> #include <algorit ...
- Codeforces 746G New Roads (构造)
G. New Roads ...
- 【codeforces 746G】New Roads
[题目链接]:http://codeforces.com/problemset/problem/746/G [题意] 给你3个数字n,t,k; 分别表示一棵树有n个点; 这棵树的深度t,以及叶子节点的 ...
- B - Save the problem! CodeForces - 867B 构造题
B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...
- Johnny Solving CodeForces - 1103C (构造,图论)
大意: 无向图, 无重边自环, 每个点度数>=3, 要求完成下面任意一个任务 找一条结点数不少于n/k的简单路径 找k个简单环, 每个环结点数小于n/k, 且不为3的倍数, 且每个环有一个特殊点 ...
- Codeforces 1188A 构造
题意:给你一颗树,树的边权都是偶数,并且边权各不相同.你可以选择树的两个叶子结点,并且把两个叶子结点之间的路径加上一个值(可以为负数),问是否可以通过这种操作构造出这颗树?如果可以,输出构造方案.初始 ...
- C - Long Beautiful Integer codeforces 1269C 构造
题解: 这里的m一定是等于n的,n为数最大为n个9,这n个9一定满足条件,根据题目意思,前k个一定是和原序列前k个相等,因此如果说我们构造出来的大于等于原序列,直接输出就可以了,否则,由于后m-k个一 ...
- [刷题]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 ...
- Dividing the numbers CodeForces - 899C (构造)
大意: 求将[1,n]划分成两个集合, 且两集合的和的差尽量小. 和/2为偶数最小差一定为0, 和/2为奇数一定为1. 显然可以通过某个前缀和删去一个数得到. #include <iostrea ...
随机推荐
- wim
wim 编辑 WIM是英文Microsoft Windows Imaging Format(WIM)的简称,它是Windows基于文件的映像格式.WIM 映像格式并非现在相当常见的基于扇区的映像格式, ...
- 使用Jmeter做性能测试
上周刚刚做完项目的性能测试.今天整理和总结一下,随便分享给大家. 首页呢,测试前,我们是有明确的性能指标的,而且测试环境和数据都已准备好,业务分析.场景分析大家根据自己的项目系统进行分析设计,我们选用 ...
- Python+Selenium练习篇之9-清除文本方法
在前面的基础篇的最后一篇,我们用到了输入字符和点击按钮这样的操作.用send_keys()来输入字符串到文本输入框这样的页面元素,用click()来点击页面上支持点击的元素.有时候,我们需要清除一个文 ...
- [oldboy-django][2深入django]FBV + CBV + 装饰器
FBV django CBV & FBV - FBV function basic view a. urls 设置 urls(r'^test.html$', views.test) b. vi ...
- css的float和position属性
(1)float的简单用法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- spring IOC注解方式详解
本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一,概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以 ...
- 再次理解javascript的apply
普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,ja ...
- 2015暑假训练(UVALive 5983 - 5992)线段树离线处理+dp
A: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83690#problem/A 题意:N*M的格子,从左上走到右下,要求在每个点的权值 ...
- Web进程被kill掉后线程还在运行怎么办?
目录 背景描述 原因分析 处理方案 参考 背景描述 系统有一个配置表,系统在启动后会启动一个线程,每隔5分钟将配置表里所有的数据更新到内存中. 系统是通过jenkins构建(直接kill掉Web进程, ...
- 【bzoj1367】[Baltic2004]sequence 可并堆
题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include & ...