[ARC103F]Distance Sums
题意:有一棵树,对于每个点$i$,给出了它到其他点的距离和$i$,现在要还原这棵树,保证$d_i$两两不同
一个点从$u$移到相邻节点$v$时,若删掉$(u,v)$后$u$这边的连通块大小为$siz_u$,$v$这边的连通块大小为$siz_v$,那么$d_v=d_u-siz_v+siz_u$
首先,有最大$d_x$的$x$是叶子,并且我们知道它的父亲的$d$为$d_x-(n-1)+1$
所以考虑按$d$从大到小的顺序确定每个点$x$的父亲:这个点的$d$必须是$d_x-(n-siz_x)+siz_x$,因为题目保证了$d_i$两两不同,所以这个过程容易实现,如果中间找不到对应的$d$或者$siz_x=\frac n2$就无解
最后还得判一下造出来的树是否真的符合要求,因为这种构造方式没有保证根的$d$是对的,一旦根的$d$是对的,那么整棵树就是满足要求的了
#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
map<ll,int>p;
map<ll,int>::iterator it;
int fa[100010],siz[100010],a[100010],b[100010],h[100010],nex[200010],to[200010],M,n;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
ll wd[100010],d[100010];
void dfs(int x,int dis){
siz[x]=1;
d[1]+=dis;
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x]){
fa[to[i]]=x;
dfs(to[i],dis+1);
siz[x]+=siz[to[i]];
}
}
}
void dfs(int x){
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x]){
d[to[i]]=d[x]+n-siz[to[i]]*2;
dfs(to[i]);
}
}
}
int get(int x){return fa[x]==x?x:(fa[x]=get(fa[x]));}
int main(){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lld",wd+i);
p[wd[i]]=i;
}
for(i=1;i<=n;i++){
fa[i]=i;
siz[i]=1;
}
it=p.end();
for(it--;it!=p.begin();it--){
if(n-siz[it->second]*2==0||!p.count(it->first-(n-siz[it->second]*2))){
puts("-1");
return 0;
}
M++;
a[M]=it->second;
b[M]=p[it->first-(n-siz[it->second]*2)];
siz[fa[a[M]]=get(b[M])]+=siz[a[M]];
}
M=0;
for(i=1;i<n;i++){
add(a[i],b[i]);
add(b[i],a[i]);
}
fa[1]=0;
dfs(1,0);
dfs(1);
for(i=1;i<=n;i++){
if(wd[i]!=d[i]){
puts("-1");
return 0;
}
}
for(i=1;i<n;i++)printf("%d %d\n",a[i],b[i]);
}
[ARC103F]Distance Sums的更多相关文章
- 「ARC103D」 Distance Sums
「ARC103D」 Distance Sums 传送门 水题. 首先如果让你求树上的节点 \(i\) 到其它所有节点的距离和,这是非常简单的,这就是非常常规的换根 \(\texttt{DP}\). 那 ...
- [atARC103F]Distance Sums
给定$n$个数$d_{i}$,构造一棵$n$个点的树使得$\forall 1\le i\le n,\sum_{j=1}^{n}dist(i,j)=d_{i}$ 其中$dist(i,j)$表示$i$到$ ...
- ARC103
ARC103E Tr/ee 首先没有叶子显然不科学,\(s_n\)是1也不怎么科学,\(s_i != s_{n-i}\)同样不怎么科学 特判掉上述情况后先把root记为1,链接(root,i+1)如果 ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
- 【AtCoder】ARC103
C - //// 为了防止一些多余的判断,我选择直接记录每个数的个数,然后枚举第一个数,找第一个数之外第二个数改变最少的情况下应该选什么 代码 #include <bits/stdc++.h&g ...
- AtCoder | ARC103 | 瞎讲报告
目录 ARC 103 A.//// B.Robot Arms C.Tr/ee D.Distance Sums ARC 103 窝是传送门QwQ A.//// 题意 : 给你\(n\)(\(n\)为偶数 ...
- AtCoder Regular Contest 103
传送门 C - /\/\/\/ 题意: 给出一个序列\(\{a_i\}\),先要求其满足以下条件: \(a_i=a_{i+2}\) 共有两个不同的数 你现在可以修改任意个数,现问最少修改个数为多少. ...
- [LeetCode] 327. Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
随机推荐
- Optimal Milking(POJ2112+二分+Dinic)
题目链接:http://poj.org/problem?id=2112 题目: 题意:有k台挤奶机,c头奶牛,每台挤奶机每天最多生产m的奶,给你每个物品到其他物品的距离(除了物品到自己本省的距离为0外 ...
- 计算机网络课设之基于UDP协议的简易聊天机器人
前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...
- 【转】jpg文件格式详解
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...
- GBK UTF-16 UTF-8 编码表
GBK UTF-16 UTF-8 ================== D2BB 4E00 E4 B8 80 一 B6A1 4E01 E4 B8 81 丁 C6DF 4E03 E4 ...
- java===java基础学习(12)---方法的重写和重载
覆盖 / 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也 ...
- 比特币编译(Ubuntu 16.04)
安装比特币需要的所有库 sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-de ...
- JavaScript原型与继承(1)
内容: 创建对象的几种模式以及创建的过程 原型链prototype的理解,以及prototype与 __proto__([[Prototype]])的关系 继承的几种实现 1.常见模式与原型链的理解 ...
- webapi-1 给现有MVC 项目添加 WebAPI
1. 增加一个WebApi Controller, VS 会自动添加相关的引用,主要有System.Web.Http,System.Web.Http.WebHost,System.Net.Http 2 ...
- hdu 1428(很好的一道题,最短路+记忆化搜索)
漫步校园 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- NYOJ 201 作业题
作业题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过 ...