传送门: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. c++中cin的基本使用方法

    一.最主要的使用方法cin>> 接收一个数字.字符.字符串.遇"空格"."TAB"."回车"都结束 比如: <span s ...

  2. ssdb底层实现——ssdb底层是leveldb,leveldb根本上是skiplist(例如为存储多个list items,必然有多个item key,而非暴力string cat),用它来做redis的list和set等,势必在数据结构和算法层面上有诸多不适

    我已经在用ssdb的hash结构,存储了很多数据了,但是我现在的用法正确吗? 我使用hash结构合理吗? 1. ssdb数据库说是类似redis,而且他们都有hash结构,但是他们的命名有点不同,ss ...

  3. CodeForces - 789D Weird journey

    D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. hdu1533 费用流模板

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. js返回16位随机数

    public string GetDataRandom()        {            string strData=DateTime.Now.ToString();            ...

  6. day-05 python函数

    # #-*- coding:utf-8 -*-# 1:编写一个名为 make_shirt()的函数,它接受一个尺码以及要印到 T 恤上的字样.这个函数应打印一个句子,概要地说明 T 恤的尺码和字样.d ...

  7. JVM内存模型和GC垃圾回收

    JVM 内存区域 1.程序计数器 这是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,指的是上次代码被执行的地方,线程私有. 2.Java 虚拟机栈 它是 Java方法执行的 ...

  8. B - Bit++

    Problem description The classic programming language of Bitland is Bit++. This language is so peculi ...

  9. C#三种创建对象方法所需时间比较。。。。。

    C#创建对象的三种方法  new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...

  10. Redis学习笔记(三)-数据类型之string类型

    string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象.从内部实现来看其实string可以看作byte ...