CF1632E1 Distance Tree (easy version)
CF1632E2 Distance Tree (hard version)

很神仙的一道题,结论也很神仙

算法分析

先考虑对于每一个 x x x 如何来求答案。问题可以转化为我们添加的边至少有一个端点是 1 1 1,因为如果添加的边是 ( u , v ) (u,v) (u,v),假设 d u ≤ d v d_u \leq d_v du​≤dv​,那么我们连边 ( 1 , v ) (1,v) (1,v) 的图一定更优。这个能感性理解。

那么考虑把问题转化,对于一个值 a n s ans ans,是否存在一个点 v v v,使得加入边 ( 1 , v ) (1,v) (1,v) 之后的新图的 max ⁡ ( d i ) \max(d_i) max(di​) 的最小值不大于 a n s ans ans。那么原树里每一个 d u > a n s d_u > ans du​>ans 的 u u u 都必须要被新加入的边 ( 1 , v ) (1,v) (1,v) 更新,具体的, d u ′ = min ⁡ ( d u , x + d i s ( v , u ) ) d'_u = \min(d_u,x+dis(v,u)) du′​=min(du​,x+dis(v,u)),其中 d i s ( v , u ) dis(v,u) dis(v,u) 为原树中 v v v 到 u u u 的距离。那么对于所有 d u > a n s d_u > ans du​>ans 的 u u u,必须满足 d i s ( v , u ) + x ≤ a n s dis(v,u)+x \leq ans dis(v,u)+x≤ans。我们发现,这个值 a n s − x ans-x ans−x 与 u u u 具体是哪一个点没有关系。所以我们只需要让 max ⁡ ( d i s ( v , u ) ) \max(dis(v,u)) max(dis(v,u)) 尽量小即可。这个模型很经典

我们需要在原树上找到一条最长的路径 x → ⋯ → y x \rightarrow \dots \rightarrow y x→⋯→y,满足 d x , d y > a n s d_x,d_y > ans dx​,dy​>ans,设这条路径的长度是 l e n len len,那么答案 a n s ans ans 可行,当且仅当右式 x + ⌊ l e n + 1 2 ⌋ ≤ a n s x + \left\lfloor\dfrac{len+1}{2}\right\rfloor \leq ans x+⌊2len+1​⌋≤ans 成立,原因是我们只需要把 v v v 放到这条路径的中点上。

最后就变成了,对于每一个固定的 a n s ans ans,如何求 l e n len len 的值。这里可以用树形DP,我们先假设以 1 1 1 为根,把每一个点到 1 1 1 的距离算出来,然后取一个距离最大的点 r t rt rt,进行第二次 d f s dfs dfs,把每一个点到 r t rt rt 的距离算出来。然后我们更新每一个 d e p dep dep 对应的 f f f 数组表示上面的 l e n len len,先正着取一次 max ⁡ \max max,再倒着取一次 max ⁡ \max max。

rep(i,1,n) f[dep[0][i]] = max(f[dep[0][i]],dep[1][i]); //正着先更新一次
drep(i,n-1,0) f[i] = max(f[i],f[i+1]); //反着更新。因为i(ans)变小,答案会变大,想一下就知道,因为 //如果ans变小的话,可供选择的点就多了,答案一定不会更小

最后我们进行二分,看能取到最大的 k k k 是哪个,每次 c h e c k check check 的时候,按上面那个式子进行 c h e c k check check。

总代码

#include <bits/stdc++.h>
#define re register
#define ll long long
#define rep(a,b,c)  for(re int a(b) ; a<=c ; ++a)
#define drep(a,b,c) for(re int a(b) ; a>=c ; --a)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48) ; ch=getchar();}return x*f;
}
const int M = 3e5+10;
int T,n,rt,maxn;
vector<int> g[M];
int dep[2][M],f[M];
inline void dfs(int u,int fa,int zt){if(fa) dep[zt][u] = dep[zt][fa] + 1;for(auto v : g[u]) if(v != fa) dfs(v,u,zt);
}
inline bool check(int mid,int x) { return mid >= min(dep[0][rt],x+(f[mid+1]+1)/2); }
inline void work(){n = read();rep(i,0,n) g[i].clear(),f[i] = dep[0][i] = dep[1][i] = 0;rep(i,1,n-1){int u = read(),v = read();g[u].push_back(v),g[v].push_back(u);}dfs(1,0,0);rt = 0,maxn = 0;rep(i,1,n) if(dep[0][i] > maxn) { maxn = dep[0][i]; rt = i; }dfs(rt,0,1);rep(i,1,n) f[dep[0][i]] = max(f[dep[0][i]],dep[1][i]);drep(i,n-1,0) f[i] = max(f[i],f[i+1]);rep(x,1,n){int l = 0,r = n,ans = n;while(l <= r){int mid = (l+r)>>1;if(check(mid,x)) ans = mid,r = mid-1;else l = mid+1;}printf("%d ",ans);}puts("");
}
signed main(){T = read();while(T--) work();return 0;
}

CF1632E1/E2题解相关推荐

  1. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  2. 2018 焦作站亚洲区域赛校内选拔赛题解

    SUST_2018 焦作站亚洲区域赛校内选拔赛 A.高速        by yoyo tag:图论.最短路 //最短路 #include<bits/stdc++.h> using nam ...

  3. 2018-2019 ACM—ICPC SEERC 题解

    2018 - 2019 SEERC 题解 比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了. 在这里分享一篇我自己写的题解,也方便别人补题. 题目链接 http://codeforces.co ...

  4. 北航校赛2014 预赛 题解

    比赛地址 第十届北航程序设计竞赛网络预赛 A. face the truth 题意: "差点儿全部队伍都通过了题目"的含义是"有超过一半的队伍过了题目".如今n ...

  5. 2019 高教社杯数模竞赛A题 高压油管的压力控制 题解

    2019 高教社杯数模竞赛A题 高压油管的压力控制 题解 问题一题解 分析 求解 求解微分方程 求解管内燃油密度变化 问题二题解 分析 求解 燃油的进入 燃油的喷出 模型的求解 问题三题解 分析 求解 ...

  6. DZY Loves Chinese/DZY Loves Chinese II 题解

    题目传送门1 \, 题目传送门2 题目大意: 给一张无向图,每次询问删掉一些边,然后问图是否连通,强制在线. 题解1 DZY Loves Chinese 和 DZY Loves Chinese II ...

  7. 【BUUCTF】Crypto题解

    文章目录 MD5 一眼就解密 Url编码 看我回旋踢 摩丝 password 变异凯撒 Quoted-printable Rabbit 篱笆墙的影子 RSA Alice与Bob 丢失的MD5 RSA ...

  8. 2020团体程序设计天梯赛题解(部分)

    文章目录 个人题解:这里我只写我个人认为应该写的题解,太简单的就不写了 L2-2 口罩发放 (25分) 思路:正解 L2-3 完全二叉树的层序遍历 (25分) 思路:正解 L2-4 网红点打卡攻略 ( ...

  9. PAT (Advanced Level) Practice 题解代码 - II (1051-1100)

    PAT PAT (Advanced Level) Practice - II(1051-1100) -------------------------------------------------- ...

最新文章

  1. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版...
  2. sublime配置python3_Sublime Text 3 Python3环境配置
  3. 深入理解DefaultMessageListenerContainer
  4. mysql受影响的行 0_为什么更新/删除成功时受影响的行返回0?
  5. ROLAP、MOLAP和HOLAP联机分析处理区别
  6. 内推 | 旷视研究院深度学习实习生招聘(含内推邮箱)
  7. eigen 编译_四足机器人优化方法:Webots下Eigen与qpOASES非线性优化库环境搭建
  8. kali安卓手机木马远控
  9. nbu mysql_mysql数据备份之NBU
  10. 马哥linux高端班视频,马哥Linux高端运维云计算就业班
  11. 排序算法图解(一):冒泡排序与冒泡排序的优化
  12. 关于Excel2003行数(65535)和列数(255)限制问题解决
  13. 大白话讲调度:非支配遗传算法与柔性作业车间调度
  14. C# Winfrom 右键菜单
  15. 估算的合同总价与实际的合同总价
  16. ##实验 1-3 GVRP 配置
  17. 38.DevOps之基于Jenkins实现的CI与CD
  18. 安卓逆向 -- Xposed模块编写
  19. “高高兴兴上班,平平安安回家”
  20. 《Natural Language Processing with Python》读书笔记 001期

热门文章

  1. 30套中国风PPT/创意PPT模板
  2. 课程设计-地铁自助售票机模拟系统
  3. Sybase数据库----简介(2)
  4. 易维触摸屏手写输入系统
  5. 李飞飞团队 | 零样本泛化技术
  6. HP-UX磁盘管理:新磁盘发现、LVM创建与扩展
  7. IDEA 设置文件关联规则
  8. 科大讯飞语音技术学习
  9. 计算机cct考试在线答题,计算机一级(CCT)练习题及答案
  10. 禅道集成极狐gitlab #JIHULAB101