「CCO 2020」千山万壑
「CCO 2020」千山万壑
性质推演
推论1:不选择非树边时,答案为 \(2(n-1)-\) 直径长
比较明显就不证了
推论2:最多只会选择一条非树边
考虑如果选择两条非树边,此时必然有答案 \(\ge n-1+3\lceil\frac{n}{3}\rceil\)
因为能够选择这样的非树边,则必然存在一条长度 \(>\frac{n}{3}\) 的路径,也就是说
直径长度 \(>\frac{n}{3}\) ,故此时选择直径更优
因此不会选择两条非树边
\[ \ \]
答案计算
下称起点终点路径 \((s,t)\) ,选择的边为 \((u,v,w)\)
如果 \((s,t)\) 与 \((u,v)\) 无交,则无序额外计算贡献,此时贡献为
\(2(n-1)-dis(s,t)-(dis(u,v)-w)\)
当 \((s,t)\) 与 \((u,v)\) 有交时,设交长度为 \(len\) ,则需要额外花费 \(2(len-1)\) 的代价取遍历交部分的点
\[ \ \]
求解
显然我们需要先知道 \(dis(u,v)\) ,可以 \(O(n)\) 预处理,我们选择的非树边一定满足 \(dis(u,v)>w\)
考虑抽直径构成序列 \(L_i\) ,然后考虑每一条非树边 \((u,v,w)\) 的贡献,设 \(u,v\) 在直径上对应根的编号为 \(x,y\)
如果 \(x=y\) ,显然可以选择直径,下面讨论 \(x<y\) 的情况
- \((s,t)\) 与 \((u,v)\) 无交
1-1.对于 \((u,v)\) 之间的部分可以区间查询最值
1-2.两边预处理前缀/后缀最值
1-3.直径连接到 \(u\) , \(v\) 子树的部分的答案可以换根 \(dp\) 预处理
- \((s,t)\) 与 \((u,v)\) 有交,设交部分在直径上的区间为 \([l,r]\)
2-1. 相交跨过直径上多个点
2-1-1.若 \(x<l<r<y\) ,此时容易用线段树维护答案
2-1-2. 若 \(x<y , \text{and } (l=x \text{ or } r=y)\) ,此时显然两边部分最优一定是选择在直径上的部分
以下情况一定不优
另一边的答案可以在线段树上查询出来,是一个区间的前缀/后缀
2-2.若 \(l=r\) ,此时 \(l=x\) 或 \(l=y\) ,且在 \([u,x],[v,y]\) 部分有交
容易发现,此时确定 \((s,t)\) 一边一定在直径的一端,另一端 \(x,y\) 对应的子树中
同样可以通过换根 \(dp\) 解决
区间查询,如果使用线段树解决,复杂度为 \(O(n+m\log n)\)
如果用奇怪数据结构(猫树),复杂度为 \(O(n\log n+m)\)
「CCO 2020」千山万壑
性质推演
推论1:不选择非树边时,答案为 \(2(n-1)-\) 直径长
比较明显就不证了
推论2:最多只会选择一条非树边
考虑如果选择两条非树边,此时必然有答案 \(\ge n-1+3\lceil\frac{n}{3}\rceil\)
因为能够选择这样的非树边,则必然存在一条长度 \(>\frac{n}{3}\) 的路径,也就是说
直径长度 \(>\frac{n}{3}\) ,故此时选择直径更优
因此不会选择两条非树边
\[ \ \]
答案计算
下称起点终点路径 \((s,t)\) ,选择的边为 \((u,v,w)\)
如果 \((s,t)\) 与 \((u,v)\) 无交,则无序额外计算贡献,此时贡献为
\(2(n-1)-dis(s,t)-(dis(u,v)-w)\)
当 \((s,t)\) 与 \((u,v)\) 有交时,设交长度为 \(len\) ,则需要额外花费 \(2(len-1)\) 的代价取遍历交部分的点

\[ \ \]
求解
显然我们需要先知道 \(dis(u,v)\) ,可以 \(O(n)\) 预处理,我们选择的非树边一定满足 \(dis(u,v)>w\)
考虑抽直径构成序列 \(L_i\) ,然后考虑每一条非树边 \((u,v,w)\) 的贡献,设 \(u,v\) 在直径上对应根的编号为 \(x,y\)
确定非树边之后,我们需要选择一个最优的 \((s,t)\) ,答案计算上面已经提及
如果 \(x=y\) ,显然可以选择直径,下面讨论 \(x<y\) 的情况
- \((s,t)\) 与 \((u,v)\) 无交
1-1.对于 \((u,v)\) 之间的部分可以区间查询子树最值
1-2.两边预处理前缀/后缀最值
1-3.直径连接到 \(u\) , \(v\) 子树的部分的答案
就是一棵树剔除根到一个点路径之后的直径长度,可以换根 \(dp\) 预处理
- \((s,t)\) 与 \((u,v)\) 有交,设交部分在直径上的区间为 \([l,r]\)
容易参分转化为求解: \(dis(s,t)+dis(u,v)-w-2(r-l)+2\) 最大值

2-1. 相交跨过直径上多个点
2-1-1.若 \(x<l<r<y\) ,此时容易用线段树维护答案
合并时减去跨过长度的贡献即可

2-1-2. 若 \(x<y , \text{and } (l=x \text{ or } r=y)\) ,此时显然两边部分最优一定是选择在直径上的部分

以下情况一定不优

另一边的答案可以在线段树上查询出来,是一个区间的前缀/后缀
2-2.若 \(l=r\) ,此时 \(l=x\) 或 \(l=y\) ,且在 \([u,x],[v,y]\) 部分有交

容易发现,此时确定 \((s,t)\) 一边一定在直径的一端,另一端 \(x,y\) 对应的子树中
同样可以通过换根 \(dp\) 解决
区间查询,如果使用线段树解决,复杂度为 \(O(n+m\log n)\)
如果用奇怪数据结构(猫树),复杂度为 \(O(n\log n+m)\)
1 |
|