「ARC103D」 Distance Sums

传送门

水题。

首先如果让你求树上的节点 \(i\) 到其它所有节点的距离和,这是非常简单的,这就是非常常规的换根 \(\texttt{DP}\)。

那么,我们可以观察一下这个答案的递推式:\(f_u=f_{fa_u}-siz_u+(n-siz_u)\)。

也就是说,如果我们确定了 \(f_u\),那么我们可以确定 \(f_{fa_u}\) 的值。

又根据递推式,我们可以考虑这样的一种构造方式:

首先将 \(f\) 从大到小排序,如果当前 \(f\) 值未被标记过,则令其为叶子节点,否则将其与对应节点连边。

然后根据递推式将 \(f_u-n+2siz_u\) 标记。

如此,如果不能建出 \(n-1\) 条边,那么肯定不存在合法解。

然后值得注意的几点:

  • 注意我们实际上只是保证了 \(f_{fa_u}-f_u\) 的差值符合题目要求,所以我们需要对我们建出的树任意求出某个点的 \(f\) 来检验正确性。
  • 在 \(f\) 中有两个最小值(即树有两个重心)时依据不同写法可能会有一些细节需要处理。(虽然数据没卡)

贴代码

  1. /*---Author:HenryHuang---*/
  2. /*---Never Settle---*/
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. typedef long long ll;
  6. const ll maxn=1e5+5;
  7. struct node{
  8. ll d;ll id;
  9. bool operator<(const node &h)const{
  10. return d>h.d;
  11. }
  12. }p[maxn];
  13. map<ll,int> mp;
  14. ll cnt;
  15. ll num[maxn];
  16. vector<int> e[2*maxn];
  17. vector<pair<int,int> >ans;
  18. vector<int> g[maxn];
  19. ll dis[maxn],siz[maxn];
  20. void dfs(int u,int f){
  21. siz[u]=1;
  22. for(auto v:g[u]){
  23. if(v==f) continue;
  24. dfs(v,u);
  25. siz[u]+=siz[v];
  26. dis[u]+=dis[v]+siz[v];
  27. }
  28. }
  29. int main(){
  30. ios::sync_with_stdio(0);
  31. cin.tie(0),cout.tie(0);
  32. ll n;cin>>n;
  33. ll owo=0;
  34. for(ll i=1;i<=n;++i){
  35. ll x;cin>>x;
  36. if(i==1) owo=x;
  37. p[i]=(node){x,i};
  38. }
  39. sort(p+1,p+n+1);
  40. for(ll i=1;i<=n;++i){
  41. if(!mp.count(p[i].d)){
  42. mp[p[i].d]=++cnt;
  43. }
  44. ll tmp=mp[p[i].d];
  45. ++num[p[i].id];
  46. while(e[tmp].size()&&((p[i].d-n+2*(num[p[i].id]+num[e[tmp].back()])<=p[i].d)||i==n)){
  47. ans.emplace_back(e[tmp].back(),p[i].id);
  48. num[p[i].id]+=num[e[tmp].back()];
  49. e[tmp].pop_back();
  50. }
  51. if(!mp.count(p[i].d-n+2*num[p[i].id])){
  52. mp[p[i].d-n+2*num[p[i].id]]=++cnt;
  53. }
  54. tmp=mp[p[i].d-n+2*num[p[i].id]];
  55. e[tmp].emplace_back(p[i].id);
  56. }
  57. for(auto [x,y]:ans) g[x].emplace_back(y),g[y].emplace_back(x);
  58. dfs(1,0);
  59. if((int)ans.size()!=n-1||dis[1]!=owo) cout<<-1<<'\n';
  60. else
  61. for(auto [x,y]:ans) cout<<x<<' '<<y<<'\n';
  62. return 0;
  63. }

「ARC103D」 Distance Sums的更多相关文章

  1. 「ARC103D」Robot Arms「构造」

    题意 给定\(n\)个点,你需要找到一个合适的\(m\)和\(d_1,d_2,...,d_m\),使得从原点出发每次向四个方向的某一个走\(d_i\)个单位,最终到达\((x_t, y_t)\).输出 ...

  2. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  3. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  4. 「杂烩」精灵魔法(P1908逆序对弱化版)

    「杂烩」精灵魔法(P1908逆序对弱化版) 题面: 题目描述 \(Tristan\)解决了英灵殿的守卫安排后,便到达了静谧的精灵领地--\(Alfheim\) .由于$ Midgard$ 处在$ Al ...

  5. Python后端日常操作之在Django中「强行」使用MVVM设计模式

    扫盲 首先带大家了解一下什么是MVVM模式: 什么是MVVM?MVVM是Model-View-ViewModel的缩写. MVVM是MVC的增强版,实质上和MVC没有本质区别,只是代码的位置变动而已 ...

  6. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  7. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  8. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  9. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

随机推荐

  1. Camera Calibration 相机标定

    Camera Calibration 相机标定 一.相机标定方法 在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc).相机外参矩阵(R t)以及 ...

  2. BEP 7:CUDA外部内存管理插件(下)

    BEP 7:CUDA外部内存管理插件(下) Numba依赖 向库中添加EMM插件的实现自然会使Numba成为库的依赖项,而以前可能没有.为了使依赖关系可选,如果需要的话,可以有条件地实例化并注册EMM ...

  3. python+selenium基础篇,网页截图

    代码如下: from selenium import webdriver dr=webdriver.Firefox() dr.get("https://www.baidu.com" ...

  4. 『居善地』接口测试 — 12、Moco框架介绍

    目录 1.Mock功能介绍 2.Moco框架介绍 3.Moco框架在接口测试中的作用 4.Moco框架的优点 5.Moco框架的下载与启动 (1)Moco框架的下载 (2)Moco框架的启动 1.Mo ...

  5. JavaScript DOM编程艺术第四章 — JavaScript图片库案例研究

    这一章通过JavaScript图片库案例,学习了一些DOM属性. HTML代码 <!DOCTYPE html> <html> <head> <meta cha ...

  6. 使用charles抓取https的方法

    自己整理的步骤做个记录 1.下载证书,官方地址:http://www.charlesproxy.com/ssl.zip 可直接点击链接下载:http://charlesproxy.com/getssl ...

  7. 终于放弃了单调的swagger-ui了,选择了这款神器—knife4j

    knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案(在非Java项目中也提供了前端UI的增强解决方案),前身是swagger-bootstrap-ui,取名knife ...

  8. Redis不是只有get set那么简单

    我以前还没接触Redis的时候,听到大数据组的小伙伴在讨论Redis,觉得这东西好高端,要是哪天我们组也可以使用下Redis就好了,好长一段时间后,我们项目中终于引入了Redis这个技术,我用了几下, ...

  9. SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存

    系统环境: Redis 版本:5.0.7 SpringBoot 版本:2.2.2.RELEASE 参考地址: Redus 官方网址:https://redis.io/ 博文示例项目 Github 地址 ...

  10. 让Github畅通无阻,FastGithub1.0.0发布

    前言 我近半年来被github的抽风虐得没脾气了,虽然我有代理的方式来上网,但代理速度并不理想,而且有时代理服务一起跟着抽风.这时候,我会搜索"github访问不了"相关题材,其中 ...