[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 ...
随机推荐
- 9.0docker的数据管理
dopcker容器的数据卷 为容器添加数据卷 sudo docker run -v ~/container data:/data -it ubuntu /bin/bash 查 ...
- vim查找/替换字符串【转】
转自:http://www.cnblogs.com/GODYCA/archive/2013/02/22/2922840.html vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细 ...
- linux===Ubuntu 上安装 Node.js
https://www.cnblogs.com/andfly/p/6681487.html
- python基础===获取知乎标题时候,文件编码失败的总结
总结一下,关于获取到的信息编码失败. 刚才在执行代码的时候,发现一个问题: 然后修改代码如下: '''爬取知乎界面的标题''' import requests import re import sys ...
- barrier 和 preempt_disable() 学习【转】
#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier(); \ }while(0) 一.这个barrier 在干什么. ...
- python爬虫模块之HTML解析模块
这个就比较简单了没有什么好强调的,如果返回的json 就是直接按照键值取,如果是网页就是用lxml模块的html进行xpath解析. from lxml import html import json ...
- sicily 数据结构 1014. Translation
Description You have just moved from Waterloo to a big city. The people here speak an incomprehensib ...
- 快速排序算法的c++实现
很早以前看过快排算法觉得自己掌握了,,课今天用的时候发现老出错,认真想想发现自己一直搞错了... 下面先说一下我的想法: 首先,快排的思想就是 从数列中挑出一个元素,称为 "基准" ...
- Python的语言特性
1.Python的函数传参 Python中所有的变量都可以理解为内存中一个对象的“引用”,或者,也可以看似C中的void *的感觉.这里记住的是类型是属于对象的,而不是变量.对象分为两种: 可更改的: ...
- 网站服务器压力Web性能测试(1):Apache Bench:Apache自带服务器压力测试工具
一个网站或者博客到底能够承受多大的用户访问量经常是我们在用VPS或者独立服务器搭建网站了最关心的问题,还有不少人喜欢对LNMP或者LAMP进行一些优化以便提高Web性能,而优化后到底有多大的效果,就需 ...