传送门:http://codeforces.com/contest/902/problem/C

本题是一个关于“树”的问题。

将一棵高度为h的有根树表示为数列{ai|i=0,1,2,...,h},其中ai是与根结点的距离为i的结点之数目。求:对于给定的数列,其对应的树的构型是否唯一?若不唯一,试构造两棵不同构的树,打印其特征数列{pi|i=1,2,...,n},其中,pii的父结点(若i为根结点,则pi为0)。

首先,按照数列{a},将树分层:即第i层是与根结点距离为i的结点构成的集合。

考虑在此约束下,一棵树出现异构的情形:当上下层结点存在连接的异构时,树出现异构。此时,上下层的节点数目均不唯一,即ai>1且ai-1>1。

首先考虑树的一种构型X,这种构型是将下层的所有结点连接到上层的某一个结点上的。于是,这棵树上的所有结点,或者位于最长路径上,或者是连接在最长路径上的叶结点。例如:

接下来首先讨论本题的案例,给定数列{1,2,2}。可以按照“构型X”构造树如下:

这棵树的特征数列为{0,1,1,3,3},其一种“异构体”如下:

可见,这个“异构体”是将原来的树删除边(3,4),再连接边(2,4)得到的。其特征数列为{0,1,1,2,3}。

于是,对于一棵“构型X”的树,将其下层的一个结点与上层的一个叶结点构建边,即得到另一种构型的树。于是,可以得到树的两种构型。参考程序如下:

#include <stdio.h>
#define MAX_H 100001
#define MAX_N 200001 int a[MAX_H];
int sum[MAX_H]; //prefix-sum.
int p[][MAX_N]; //parent of vertex. int main(void)
{
int h;
scanf("%d", &h);
for (int i = ; i <= h; i++) {
scanf("%d", &a[i]);
//count prefix-sum.
if (i) sum[i] = sum[i - ];
sum[i] += a[i];
}
int cur = ;
bool flag = true;
p[][] = p[][] = ;
for (int i = ; i <= h; i++) {
for (int j = ; j < a[i]; j++) {
cur++;
p[][cur] = p[][cur] = sum[i - ];
}
if (a[i] > && a[i - ] > ) {
flag = false;
p[][cur]--;
}
}
if (flag) printf("perfect\n");
else {
printf("ambiguous\n");
for (int i = ; i < ; i++) {
for (int j = ; j <= sum[h]; j++)
printf("%d ", p[i][j]);
printf("\n");
}
}
return ;
}

Codeforces 902C/901A - Hashing Trees的更多相关文章

  1. Codeforces 9D How many trees? 【计数类DP】

    Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...

  2. 【Codeforces Round #453 (Div. 2) C】 Hashing Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有当a[i]和a[i-1]都大于1的时候才会有不同的情况. a[i] >= a[i-1] 且a[i-1]>=2 则 ...

  3. Codeforces 545E. Paths and Trees 最短路

    E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...

  4. CodeForces #369 C. Coloring Trees DP

    题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少.   K:连续的颜色为一组 ...

  5. codeforces 711C C. Coloring Trees(dp)

    题目链接: C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  6. Codeforces 711 C. Coloring Trees (dp)

    题目链接:http://codeforces.com/problemset/problem/711/C 给你n棵树,m种颜色,k是指定最后的完美值.接下来一行n个数 表示1~n树原本的颜色,0的话就是 ...

  7. Codeforces 596D Wilbur and Trees

    http://codeforces.com/contest/596/problem/D 题目大意: 有n棵树排成一排,高度都为h. 主人公要去砍树,每次等概率地随机选择没倒的树中最左边的树或者最右边的 ...

  8. codeforces 633G. Yash And Trees dfs序+线段树+bitset

    题目链接 G. Yash And Trees time limit per test 4 seconds memory limit per test 512 megabytes input stand ...

  9. codeforces902C. Hashing Trees

    https://codeforces.com/contest/902/problem/C 题意: 给你树的深度和树的每个节点的深度,问你是否有重构,如果有重构输出两个不同的结构 题解: 如果相邻节点的 ...

随机推荐

  1. hibernate实战笔记1---初探

    因为在学习Spring的时候学到有关数据库的章节的时候,提及到了hibernate的集成,可是我对hibernate技术差点儿是一点不了解.仅仅是知道它是一个orm对象映射框架,所以在初探的章节做一下 ...

  2. jQuery - 当当网我的订单页

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. luogu1631 序列合并

    题目大意 有两个序列A,B,在A和B中各取一个数相加能得到$n^2$个和.求出这些和前n小的数字. 题解 首先这道题不可以用自己想的什么A序列B序列各两个指针的自己发明的模拟算法,用这样的算法只能是绝 ...

  4. oc60--Category 分类 练习

    // main.m // Category练习 #import <Foundation/Foundation.h> #import "NSString+NJ.h" // ...

  5. How to Integrate .NET Projects with Jenkins

    https://www.swtestacademy.com/jenkins-dotnet-integration/ 8) Unit Tests and Test Coverage Settings D ...

  6. C# WinForm小程序(技术改变世界-cnblog)

    WinForm小程序(技术改变世界-cnblog)   需求: 1.点击按钮  更新 当前时间 2.输入 身份证,必须身份证 排序(类似银行卡那样的空格),自动生成空格排序 3.实现 必须按 第一个按 ...

  7. RTP协议分析和详解

    一.RTP协议分析 第1章.     RTP概述 1.1.  RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...

  8. Linux防火墙设置

    对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的.因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的. Linux提供了一个非常优秀的防火墙工具-netfil ...

  9. Colored Sticks(trie)

    http://poj.org/problem?id=2513 题意:给一些木棒,木棒两端图上颜色,将端点颜色相同的木棒连在一起,问是否能连成一条直线. 思路:将两端的颜色看成点,将木棒看成边,判断是否 ...

  10. Winform 异步调用

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...