题意:一棵nnn个点的无权树,给定每个点iii到其他所有点的距离之和did_idi​,保证did_idi​两两不同。构造或判断无法构造一棵满足条件的树。

n≤105n\leq 10^5n≤105

首先对于非根结点uuu,有

du=dfau−sizu+(n−sizu)d_u=d_{fa_u}-siz_u+(n-siz_u)du​=dfau​​−sizu​+(n−sizu​)

所以ddd最大的一定是叶子结点

把ddd从大到小排序,然后用上面的式子依次找到每个点的父亲,如果没有找到输出无解。

注意并不是由儿子的ddd来确定它的父亲是谁,它的父亲以及ddd值是早就定好了的,你只是把它找出来。这个式子是计算式而不是决定式。

因为ddd值是唯一的,所以这个过程是确定的,如果有解的话一定可以确定出来。

注意构造出来了不一定代表有解,如果把ddd看成nnn个变量,而n−1n-1n−1条边只能确定ddd之间的关系。所以需要判断一个点算出的ddd是否是真正的ddd,直接把sizsizsiz加起来就是drootd_{root}droot​,判一下即可。

复杂度O(nlog⁡n)O(n\log n)O(nlogn)

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <utility>
#define MAXN 100005
using namespace std;
typedef long long ll;
typedef pair<ll,int> pi;
ll read()
{ll ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
pi p[MAXN];
int siz[MAXN],fa[MAXN];
ll d[MAXN];
int main()
{int n=read();for (int i=1;i<=n;i++) p[i]=make_pair(read(),i),siz[i]=1;sort(p+1,p+n+1);ll sum=0;for (int i=n;i>1;i--){ll t=p[i].first-n+2*siz[p[i].second];int k=lower_bound(p+1,p+n+1,make_pair(t,0))-p;if (p[k].first!=t) return puts("-1"),0;fa[p[i].second]=p[k].second,siz[p[k].second]+=siz[p[i].second];sum+=siz[p[i].second];}if (sum!=p[1].first) return puts("-1"),0;for (int i=1;i<=n;i++) if (fa[i]) printf("%d %d\n",fa[i],i);return 0;
}

【ARC103D】Distance Sums【树论】【构造】相关推荐

  1. lintcode:线段树的构造

    线段树的构造 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 ...

  2. 哈夫曼树的构造及C++代码实现

    哈夫曼树的构造过程: (1) 以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点 ...

  3. BUAA(2021春)实验:树的构造与遍历——根据提示循序渐进(可惜提示有问题Ծ‸Ծ)

    BUAA数据结构第五次编程题 --实验:树的构造与遍历 看前须知 第五次上机题汇总 实验目的与要求 实验内容 Huffman编码文件压缩 问题描述 实验准备 实验步骤 [步骤1] [步骤2] [步骤3 ...

  4. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  5. Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{p ...

  6. c语言最优树的构造,哈夫曼树的构造及编码 Haffman树的构造及其编码

    写出构造完整的哈夫曼树的编码 void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, ...

  7. 哈夫曼树的构造算法代码

    代码: #include<stdio.h> #define ERROR 0 #define OK 1 typedef int Status; //采用顺序存储结构,一维结构数组 //定义结 ...

  8. 哈夫曼树的构造C/C++代码实现

    哈夫曼树: 所谓哈夫曼(Huffman)树就是最优二叉树,是带权路径长度WPL最小的二叉树. 哈夫曼树的构造: 根据哈夫曼树的特点:权值越大的结点离根结点越近. 具体方法:依次选择权值最小的二个结点作 ...

  9. 哈夫曼树的构造(C语言实现)

    哈夫曼树的构造过程可以详见推荐博客:哈夫曼树以及哈夫曼编码的构造步骤 建议先看完推荐博客中的文字说明,或者自己找一本数据结构的树来仔细阅读以下关于哈夫曼树的构造 然后再来看下面给出的code 这里给出 ...

  10. 基础练习 Huffuman树 _C语言和C++描述!(Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1)

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. ...

最新文章

  1. js ftpclient linux server,Node.JS用Socket实现FTP Server服务器和Client客户端
  2. 互联网如何促进经济发展?腾讯、谷歌、Facebook的实践和经验
  3. Oracle分页(limit方式的运用)
  4. php下curl与file_get_contents性能对比
  5. 软件测试用例设计“八法归一”——因果阵
  6. Extending_and_embedding_php翻译
  7. Linux虚拟文件系统(VFS)
  8. python-条件语句
  9. JAVA岗位比嵌入式岗位_java嵌入式职业选择?
  10. 容器编排技术 -- Kubernetes JSONpath Support
  11. mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)
  12. (TOJ1248)Encoding
  13. Python中字符串切片操作
  14. 超三十万台设备感染银行木马、远程代码漏洞可攻击云主机|12月7日全球网络安全热点
  15. DY-SV17F运用集—语音IC
  16. php-fpm master 关系,php-fpm master worker 关系介绍
  17. codelite14中文语言包_CodeLite中文语言包
  18. 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
  19. UDIMM和RDIMM内存条区别
  20. EasyExcel生成多个exel文件并zip压缩

热门文章

  1. hutol json null值没了_JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法...
  2. 贝叶斯分类器_Sklearn 中的朴素贝叶斯分类器
  3. 如何保持纯洁男女关系……
  4. “Python简直万能!”拜托快醒醒!
  5. 数学建模,还得这样学!
  6. 在真实工作中的编程是怎么样的,与学校里有什么不同?
  7. 程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?
  8. linux 查询oracle情况,在Linux下使用SQLPlus查看Oracle数据库表空间及使用率
  9. java和python哪个学习编程_初学编程,选Java还是Python?
  10. 华为服务器停止响应,windows服务器停止工作