CEOI2019 / CodeForces 1192B. Dynamic Diameter
题目简述:给定一棵$N \leq 10^5$个节点的树,边上带权,维护以下两个操作:
1. 修改一条边的边权;
2. 询问当前树的直径长度。
解1:code
注意到树的直径有以下性质:
定理:令$\text{farthest}(x)$表示与节点$x$距离最远的节点的集合。则对任意节点$x$,都有任意$a \in \text{farthest}(x)$与$b \in \text{farthest}(a)$,$a$与$b$的距离即为直径。
我们任选一个节点$r$作为树的根,任意边$(x, y)$,若$x$为$y$的父节点,则把边权置于节点$y$上,视作点权,记作$w[y]$,则修改边权都可以视作修改点权。
我们考虑询问树的直径,可以分成两个步骤:1. 找到离$r$距离最远的叶子节点$x$。2. 找到离$x$距离最远的节点$y$。
1. 找到离$r$距离最远的叶子节点$x$。我们在树的DFS序$p_1, p_2, \dots, p_n$上查找$\text{dis}(r, p_i)$的最大值及其下标$i$,则$x = p_i$。可在$O(\log n)$时间复杂度内解决。
2. 找到离$x$距离最远的节点$y$。设$\text{LCA}(x, y) = u$,则$\text{dis}(x, y) = \text{dis}(r, x)+\text{dis}(r, y)-2\text{dis}(r, u)$。考虑树链剖分,在$x$到$r$的路径中的所有重链中,找到最大的节点$u$,使得$\text{dis}(r, \text{light}(u))-2\text{dis}(r, u)$最大,其中$\text{light}(u)$表示节点$u$的轻链连接出去的后代节点集合(包括$u$本身)。可在$O(\log^2 n)$时间复杂度内解决。
接下来考虑修改操作,我们只需要维护
1. 步骤1 的 $\text{dis}(r, p_i)$。只需要用线段树维护区间整体加减,以及区间最值即可。时间复杂度$O(\log n)$。
2. 步骤2 的 $\text{dis}(r, \text{light}(u))-2\text{dis}(r, u)$。同样需要用线段树维护区间整体加减,以及区间最值。此外,对于每一个节点$x$,我们都需要一个multiset来维护$\text{light}(x)$中节点$y$的最大值$\text{dis}(r, y)$。时间复杂度为$O(\log^2 n)$。
于是,我们可以在时间复杂度$O(n + q \log^2 n)$内解决。
注:同样做法,Link-Cut Tree可以在$O(n + q\log n)$的时间内解决。
解2:code
如果没有修改操作,这题可以用动态规划来求解。为方便,与解1一样,我们以同样的方式把边权都放在点上。特别地,$w[r] = 0$。设$f[x][0]$表示以$x$为根的子树中的直径长度,$f[x][1]$表示$x$为根的子树中与节点$x$距离最远的节点与$x$的距离 加上 节点$x$的权值$w[x]$。于是,我们有
$$ f[x][0] = \max\{ \max_{y \in \text{son}(x)}\{f[y][0]\}, \max_{y_1, y_2 \in \text{son}(x), y_1 \neq y_2}\{f[y_1][1]+f[y_2][1]\} \}, $$
$$ f[x][1] = \max_{y \in \text{son}(x)}\{ f[y][1] \} + w[x]. $$
特别地,若$\text{son}(x) = \emptyset$,则$f[x][0] = 0, f[x][1] = w[x]$;若$\text{son}(x) = \{ y \}$,则$f[x][0] = \max\{f[y][0], f[y][1]\}, f[x][1] = f[y][1]+w[x]$。
现在,我们考虑动态DP。将整棵树树链剖分之后,令
$$ g[x][0] = \max\left\{ \max_{y \in \text{lightson}(x)}\{ f[y][0] \}, \max_{y_1, y_2 \in \text{lightson}(x), y_1 \neq y_2} \{ f[y_1][1]+f[y_2][1] \} \right\}, $$
$$ g[x][1] = \max_{y \in \text{lightson}(x)}\{f[y][1]\}, $$
其中,$\text{lightson}(x) = \text{son}(x) \setminus \{ \text{heavy}(x) \}$,$\text{heavy}(x)$为节点$x$的重儿子。
简记$y = \text{heavy}(x)$,我们可以得到动态规划方程:
$$ f[x][0] = \max\{ f[y][0], g[x][0], f[y][1]+g[x][1] \}, $$
$$ f[x][1] = \max\{ f[y][1], g[x][1] \} + w[x]. $$
即
$$ \begin{bmatrix} 0 & g[x][1] & g[x][0] \\ -\infty & w[x] & g[x][1]+w[x] \\ -\infty & -\infty & 0 \end{bmatrix} * \begin{bmatrix} f[y][0] \\ f[y][1] \\ 0 \end{bmatrix} = \begin{bmatrix} f[x][0] \\ f[x][1] \\ 0 \end{bmatrix}, $$
其中$C = A*B$定义为$C_{ij} = \max_k \{ A_{ik}+B_{kj} \}$。
于是,我们可用树链剖分在$O(n + q \log^2 n)$的时间复杂度内解决。
注:同样做法,Link-Cut Tree可以在$O(n + q\log n)$的时间内解决。
再注:事实上矩阵的第一列和最后一行在进行广义乘法时是不变的,即结果矩阵永远形如
$$ \begin{bmatrix} 0 & * & * \\ -\infty & * & * \\ -\infty & -\infty & 0 \end{bmatrix}. $$
于是,我们只需要计算上述矩阵中打$*$的部分,见code。
解3:code
有一个非常巧妙的做法,考虑树的全DFS序(长度为$2n-1$的DFS序,允许一个节点在这个DFS序中出现多次)$p_1, p_2, p_3, \dots, p_{2n-1}$。
令$\text{index}(x)$表示在全DFS序上节点$x$第一次出现的下标,即$p_{\text{index}(x)} = x$。
考虑两个节点$x$和$y$,其下标$a = \text{index}(x), b = \text{index}(y)$,不妨设$a \leq b$。这两个节点之间的距离
$$\begin{aligned} \text{dis}(x, y) & = \text{dis}(r, x)+\text{dis}(r, y)-2\text{dis}(r, \text{LCA}(x, y)) \\ & = \text{dis}(r,x)+\text{dis}(r,y)-2\min_{a \leq c \leq b}\{ \text{dis}(r, p_c) \}. \end{aligned}$$
于是,树的直径则为
$$ \max_{x, y}\{\text{dis}(x,y)\} = \max_{1 \leq a \leq c \leq b \leq 2n-1 } \{ \text{dis}(r, p_a)+\text{dis}(r, p_b)-2\text{dis}(r, p_c) \}. $$
我们可以用线段树维护全DFS序在区间上的信息来解决此题,时间复杂度$O(n+q \log n)$。
CEOI2019 / CodeForces 1192B. Dynamic Diameter的更多相关文章
- P6845 [CEOI2019] Dynamic Diameter
P6845 [CEOI2019] Dynamic Diameter 题意 一颗带权树,每次更改一条边的权,每次修改后求出最大直径.强制在线. 思路 \(O(n\log^2n)\) 的暴力做法. 根据经 ...
- Codeforces 840D Expected diameter of a tree 分块思想
Expected diameter of a tree 我们先两次dfs计算出每个点能到达最远点的距离. 暴力计算两棵树x, y连边直径的期望很好求, 我们假设SZ(x) < SZ(y) 我们枚 ...
- Codeforces 1092E Minimal Diameter Forest
Minimal Diameter Forest 首先我们找出每个连通块中的特殊点, 特殊点的定义是到各种个连通块中距离的最大值最小的点, 每个连通块肯定通过特殊点连到其他连通块, 我们把有最大值的特殊 ...
- Codeforces 804D Expected diameter of a tree
D. Expected diameter of a tree time limit per test 3 seconds memory limit per test 256 megabytes inp ...
- Codeforces 804D Expected diameter of a tree(树形DP+期望)
[题目链接] http://codeforces.com/contest/804/problem/D [题目大意] 给你一个森林,每次询问给出u,v, 从u所在连通块中随机选出一个点与v所在连通块中随 ...
- Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)
题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...
- Codeforces 1082D Maximum Diameter Graph (贪心构造)
<题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...
- CodeForces 805F Expected diameter of a tree 期望
题意: 给出一个森林,有若干询问\(u, v\): 从\(u, v\)中所在子树中随机各选一个点连起来,构成一棵新树,求新树直径的期望. 分析: 回顾一下和树的直径有关的东西: 求树的直径 从树的任意 ...
- Codeforces 1192B 全dfs序 + 线段树
题意:给你一颗树,每次会修改一条边的边权,问修改之后的树的直径是多少? 思路:来源于:https://www.cnblogs.com/TinyWong/p/11260601.html 得到树的全序df ...
随机推荐
- 【剑指offer】面试题 31. 栈的压入、弹出序列
面试题 31. 栈的压入.弹出序列 NowCoder LeetCode 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如 ...
- This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
Android Studio报错 这个视图只是编辑时位置,在运行时视图会跳转到(0,0) 解决办法: 在Design界面下,有个魔棒工具,Infer Constrains,点击之后就可以了
- KAFA 监测| Kafka监测的方法和工具
1.目标 在我们上一篇Kafka教程中,我们讨论了Kafka Tools.今天,我们将看到Kafka Monitoring.在此,我们将学习如何监控Apache Kafka的概念.此外,我们将涵盖在故 ...
- 一个长耗时SQL在TiDB和Mysql上的耗时测试
之前看到的TiDB和MySql的性能对比都是大量短耗时请求下的压测,单机情况下TiDB和MySql的确有些差距,不过笔者最近碰到的场景更多是sql要扫描的行数不小的情况下单sql比较耗时的问题,所以自 ...
- lmir 随笔
近期需要研究一些特征工程的工作,就打算把微软之前公布出来的特征都复现一遍,今天遇到的特征是 LMIR, 其实也就是language model for information retrieval的简写 ...
- Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治
传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 ...
- docker-compose 单机容器编排
docker-compose用来在单机上编排容器(定义和运行多个容器,使容器能互通) docker-compose将所管理的容器分为3层结构:project service container d ...
- C# vb .net实现色调调整特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的色调调整呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- 前端开发 Vue Vue.js和Nodejs的关系
首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...
- jenkins配置Webhook-gitlab
1.Jenkins 安装完成以后,首先我们在Jenkins中需要安装一下,Gitlab Hook Plugin,GitLab Plugin,Gitlab Authentication plugin插件 ...